| On a tumbleweed system, "install X Y" was showing the error: |
| |
| pseudo: ENOSYS for 'fsetxattr'. |
| |
| which was being caused by dlsym() for that function returning NULL. This |
| appears to be due to it finding an unresolved symbol in libacl for this |
| symbol in libattr. It hasn't been resolved so its NULL. dlerror() returns |
| nothing since this is a valid symbol entry, its just not the one we want. |
| |
| We can add the glibc version string for the symbol we actually want so we get |
| that version rather than the libattr/libacl one. |
| |
| To quote libattr: |
| """ |
| These dumb wrappers are for backwards compatibility only. |
| Actual syscall wrappers are long gone to libc. |
| """ |
| and they are simply wrappers around the libc version so our attaching |
| to the libc versions should intercept any accesses via these too. |
| |
| RP 2020/06/22 |
| Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org |
| Upstream-Status: Pending [discussed with seebs on irc and appears the correct fix] |
| |
| |
| Index: git/ports/linux/xattr/wrapfuncs.in |
| =================================================================== |
| --- git.orig/ports/linux/xattr/wrapfuncs.in |
| +++ git/ports/linux/xattr/wrapfuncs.in |
| @@ -1,12 +1,12 @@ |
| -ssize_t getxattr(const char *path, const char *name, void *value, size_t size); /* flags=0 */ |
| -ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size); /* flags=AT_SYMLINK_NOFOLLOW */ |
| -ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size); |
| -int setxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=0 */ |
| -int lsetxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=AT_SYMLINK_NOFOLLOW */ |
| -int fsetxattr(int filedes, const char *name, const void *value, size_t size, int xflags); |
| -ssize_t listxattr(const char *path, char *list, size_t size); /* flags=0 */ |
| -ssize_t llistxattr(const char *path, char *list, size_t size); /* flags=AT_SYMLINK_NOFOLLOW */ |
| -ssize_t flistxattr(int filedes, char *list, size_t size); |
| -int removexattr(const char *path, const char *name); /* flags=0 */ |
| -int lremovexattr(const char *path, const char *name); /* flags=AT_SYMLINK_NOFOLLOW */ |
| -int fremovexattr(int filedes, const char *name); |
| +ssize_t getxattr(const char *path, const char *name, void *value, size_t size); /* flags=0, version="GLIBC_2.3" */ |
| +ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| +ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size); /* version="GLIBC_2.3" */ |
| +int setxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=0, version="GLIBC_2.3" */ |
| +int lsetxattr(const char *path, const char *name, const void *value, size_t size, int xflags); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| +int fsetxattr(int filedes, const char *name, const void *value, size_t size, int xflags); /* version="GLIBC_2.3" */ |
| +ssize_t listxattr(const char *path, char *list, size_t size); /* flags=0, version="GLIBC_2.3" */ |
| +ssize_t llistxattr(const char *path, char *list, size_t size); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| +ssize_t flistxattr(int filedes, char *list, size_t size); /* version="GLIBC_2.3" */ |
| +int removexattr(const char *path, const char *name); /* flags=0, version="GLIBC_2.3" */ |
| +int lremovexattr(const char *path, const char *name); /* flags=AT_SYMLINK_NOFOLLOW, version="GLIBC_2.3" */ |
| +int fremovexattr(int filedes, const char *name); /* version="GLIBC_2.3" */ |