git-xattr
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Mon, 10 Jun 2024 20:25:19 +0000 (22:25 +0200)
committerSamuel Thibault <sthibault@debian.org>
Mon, 10 Jun 2024 20:25:19 +0000 (22:25 +0200)
commit 74f9ee3b91931967df5601ad63a4b02f5cd75b43
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
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 <samuel.thibault@ens-lyon.org>
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 <samuel.thibault@ens-lyon.org>
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 <samuel.thibault@ens-lyon.org>
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
sysdeps/mach/hurd/lsetxattr.c

index 5a0fc263f5a4eb64e7570e480d9f8532c36b5359..103648e5567c72b0bda896bd71fdc2c98d86f05b 100644 (file)
@@ -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;
index 4e1e2de297f3200498ec360959be40e656e458bb..551f969297c6ddb44458fdd441bee09b90ee4905 100644 (file)
@@ -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);
 }