From f513466f8d29fae7ca39c94b6bec6f186eaffe36 Mon Sep 17 00:00:00 2001 From: GNU Libc Maintainers Date: Mon, 10 Jun 2024 22:25:19 +0200 Subject: [PATCH] git-xattr commit 74f9ee3b91931967df5601ad63a4b02f5cd75b43 Author: Samuel Thibault Date: Mon Jun 10 21:56:13 2024 +0200 hurd: Fix lsetxattr return value The manpage says that lsetxattr returns 0 on success, like setxattr. commit ba5a23422a156804234dff6c5be89e20ee8f9ec2 Author: Samuel Thibault Date: Mon Jun 10 21:57:53 2024 +0200 hurd: Fix getxattr("gnu.translator") returning ENODATA When no translator is set, __file_get_translator would return EINVAL which is a confusing value. Better check for a passive translation before getting the value. commit ed06248019908dd4f286552594ac3ec844ef3da4 Author: Samuel Thibault Date: Mon Jun 10 22:00:20 2024 +0200 hurd: Fix setxattr return value on replacing When XATTR_REPLACE is set we shall succeed when the value already exists, and fail with ENODATA otherwise, instead of the converse. commit 5968125f55a3a3f3394e4ebe45e1f96d4864c576 Author: Samuel Thibault Date: Mon Jun 10 22:01:40 2024 +0200 hurd: Fix getxattr/listxattr returning ERANGE The manpage says that when the passed size is zero, they should set the expected size and return 0. ERANGE shall be returned only when the non-zero passed size is not large enough. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-xattr.diff --- hurd/xattr.c | 43 +++++++++++++++++++++++++++-------- sysdeps/mach/hurd/lsetxattr.c | 2 +- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/hurd/xattr.c b/hurd/xattr.c index 5a0fc263f..103648e55 100644 --- a/hurd/xattr.c +++ b/hurd/xattr.c @@ -50,7 +50,15 @@ _hurd_xattr_get (io_t port, const char *name, void *value, size_t *size) else if (value) { if (*size < sizeof st.st_author) - return ERANGE; + { + if (*size > 0) + return ERANGE; + else + { + *size = sizeof st.st_author; + return 0; + } + } memcpy (value, &st.st_author, sizeof st.st_author); } *size = sizeof st.st_author; @@ -61,15 +69,33 @@ _hurd_xattr_get (io_t port, const char *name, void *value, size_t *size) { char *buf = value; mach_msg_type_number_t bufsz = value ? *size : 0; - error_t err = __file_get_translator (port, &buf, &bufsz); + struct stat64 st; + error_t err; + + err = __io_stat (port, &st); + if (err) + return err; + if ((st.st_mode & S_IPTRANS) == 0) + return ENODATA; + + err = __file_get_translator (port, &buf, &bufsz); if (err) return err; - if (value != NULL && *size < bufsz) + + if (*size < bufsz) { if (buf != value) __munmap (buf, bufsz); - return ERANGE; + + if (*size > 0) + return ERANGE; + else + { + *size = bufsz; + return 0; + } } + if (buf != value && bufsz > 0) { if (value != NULL) @@ -149,10 +175,9 @@ _hurd_xattr_set (io_t port, const char *name, const void *value, size_t size, if (err) return err; if (bufsz > 0) - { - __munmap (buf, bufsz); - return ENODATA; - } + __munmap (buf, bufsz); + else + return ENODATA; } return __file_set_translator (port, FS_TRANS_SET | ((flags & XATTR_CREATE) @@ -193,7 +218,7 @@ _hurd_xattr_list (io_t port, void *buffer, size_t *size) if (st.st_mode & S_IPTRANS) add ("gnu.translator"); - if (buffer != NULL && total > *size) + if (*size > 0 && total > *size) return ERANGE; *size = total; return 0; diff --git a/sysdeps/mach/hurd/lsetxattr.c b/sysdeps/mach/hurd/lsetxattr.c index 4e1e2de29..551f96929 100644 --- a/sysdeps/mach/hurd/lsetxattr.c +++ b/sysdeps/mach/hurd/lsetxattr.c @@ -32,5 +32,5 @@ lsetxattr (const char *path, const char *name, const void *value, size_t size, return -1; err = _hurd_xattr_set (port, name, value, size, flags); __mach_port_deallocate (__mach_task_self (), port); - return err ? __hurd_fail (err) : size; + return __hurd_fail (err); } -- 2.30.2