Andrew Geissler | d25ed32 | 2020-06-27 00:28:28 -0500 | [diff] [blame] | 1 | On a tumbleweed system, "install X Y" was showing the error: |
| 2 | |
| 3 | pseudo: ENOSYS for 'fsetxattr'. |
| 4 | |
| 5 | which was being caused by dlsym() for that function returning NULL. This |
| 6 | appears to be due to it finding an unresolved symbol in libacl for this |
| 7 | symbol in libattr. It hasn't been resolved so its NULL. dlerror() returns |
| 8 | nothing since this is a valid symbol entry, its just not the one we want. |
| 9 | |
| 10 | We can add the glibc version string for the symbol we actually want so we get |
| 11 | that version rather than the libattr/libacl one. |
| 12 | |
| 13 | To quote libattr: |
| 14 | """ |
| 15 | These dumb wrappers are for backwards compatibility only. |
| 16 | Actual syscall wrappers are long gone to libc. |
| 17 | """ |
| 18 | and they are simply wrappers around the libc version so our attaching |
| 19 | to the libc versions should intercept any accesses via these too. |
| 20 | |
| 21 | RP 2020/06/22 |
| 22 | Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org |
| 23 | Upstream-Status: Pending [discussed with seebs on irc and appears the correct fix] |
| 24 | |
| 25 | |
| 26 | Index: git/ports/linux/xattr/wrapfuncs.in |
| 27 | =================================================================== |
| 28 | --- git.orig/ports/linux/xattr/wrapfuncs.in |
| 29 | +++ git/ports/linux/xattr/wrapfuncs.in |
| 30 | @@ -1,12 +1,12 @@ |
| 31 | -ssize_t getxattr(const char *path, const char *name, void *value, size_t size); /* flags=0 */ |
| 32 | -ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size); /* flags=AT_SYMLINK_NOFOLLOW */ |
| 33 | -ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size); |
| 34 | -int setxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=0 */ |
| 35 | -int lsetxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=AT_SYMLINK_NOFOLLOW */ |
| 36 | -int fsetxattr(int filedes, const char *name, const void *value, size_t size, int xflags); |
| 37 | -ssize_t listxattr(const char *path, char *list, size_t size); /* flags=0 */ |
| 38 | -ssize_t llistxattr(const char *path, char *list, size_t size); /* flags=AT_SYMLINK_NOFOLLOW */ |
| 39 | -ssize_t flistxattr(int filedes, char *list, size_t size); |
| 40 | -int removexattr(const char *path, const char *name); /* flags=0 */ |
| 41 | -int lremovexattr(const char *path, const char *name); /* flags=AT_SYMLINK_NOFOLLOW */ |
| 42 | -int fremovexattr(int filedes, const char *name); |
| 43 | +ssize_t getxattr(const char *path, const char *name, void *value, size_t size); /* flags=0, version="GLIBC_2.3" */ |
| 44 | +ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| 45 | +ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size); /* version="GLIBC_2.3" */ |
| 46 | +int setxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=0, version="GLIBC_2.3" */ |
| 47 | +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| 48 | +int fsetxattr(int filedes, const char *name, const void *value, size_t size, int xflags); /* version="GLIBC_2.3" */ |
| 49 | +ssize_t listxattr(const char *path, char *list, size_t size); /* flags=0, version="GLIBC_2.3" */ |
| 50 | +ssize_t llistxattr(const char *path, char *list, size_t size); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| 51 | +ssize_t flistxattr(int filedes, char *list, size_t size); /* version="GLIBC_2.3" */ |
| 52 | +int removexattr(const char *path, const char *name); /* flags=0, version="GLIBC_2.3" */ |
| 53 | +int lremovexattr(const char *path, const char *name); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| 54 | +int fremovexattr(int filedes, const char *name); /* version="GLIBC_2.3" */ |