]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Preserve errno across _PC_CHOWN_RESTRICTED call on XFS
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 3 Apr 2013 05:26:45 +0000 (10:56 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 3 Apr 2013 05:26:45 +0000 (10:56 +0530)
Fix BZ #15305.

On kernel versions earlier than 2.6.29, the Linux kernel exported a
sysctl called restrict_chown for xfs, which could be used to allow
chown to users other than the owner.  2.6.29 removed this support,
causing the open_not_cancel_2 to fail and thus modify errno.  The fix
is to save and restore errno so that the caller sees it as unmodified.

Additionally, since the code to check the sysctl is not useful on
newer kernels, we add an ifdef so that in future the code block gets
rmeoved completely.

ChangeLog
NEWS
sysdeps/unix/sysv/linux/kernel-features.h
sysdeps/unix/sysv/linux/pathconf.c

index 3d85c1da059569ae344bb295db6847b23e37582d..64e9c882c84da47afa2ca4f66a99e77a635cf5f2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-04-03  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+       [BZ #15305]
+       * sysdeps/unix/sysv/linux/kernel-features.h
+       [__LINUX_KERNEL_VERSION >= 0x02061d]: Define
+       __ASSUME_XFS_RESTRICTED_CHOWN.
+       * sysdeps/unix/sysv/linux/pathconf.c
+       (__statfs_chown_restricted) [!__ASSUME_XFS_RESTRICTED_CHOWN]:
+       Save and restore errno.
+
 2013-04-02  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #15327]
diff --git a/NEWS b/NEWS
index 56cdc56d9edd6478f3381a3206393046558629c4..7718a0a14dbf3ed5553f7a3c77acfc33834a5857 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,7 +12,8 @@ Version 2.18
   10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
   14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994,
   14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078,
-  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15307, 15327.
+  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307,
+  15327.
 
 * Add support for calling C++11 thread_local object destructors on thread
   and program exit.  This needs compiler support for offloading C++11
index 8fdff7e38135f1e464a3ebc16c747b4c52b7432f..ccd4c5918b3e943def2aa37fa016a1f56fe776b9 100644 (file)
 #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100
 # define __ASSUME_GETCPU_SYSCALL       1
 #endif
+
+/* 2.6.29 removed the XFS restricted_chown sysctl, so it is pointless looking
+   for it in newer kernels.  */
+#if __LINUX_KERNEL_VERSION >= 0x02061d
+# define __ASSUME_XFS_RESTRICTED_CHOWN 1
+#endif
index de91a4541bf8e9bb0ae2754900804be12c059dac..723d234538d51a9efd5e621c6ebca1ed08269a82 100644 (file)
@@ -289,11 +289,16 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
       return -1;
     }
 
+#if __ASSUME_XFS_RESTRICTED_CHOWN
+  return 1;
+#else
   int fd;
+  int save_errno;
   long int retval = 1;
   switch (fsbuf->f_type)
     {
     case XFS_SUPER_MAGIC:
+      save_errno = errno;
       /* Read the value from /proc/sys/fs/xfs/restrict_chown.  If we cannot
         read it default to assume the restriction is in place.  */
       fd = open_not_cancel_2 ("/proc/sys/fs/xfs/restrict_chown", O_RDONLY);
@@ -306,6 +311,7 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
 
          close_not_cancel_no_status (fd);
        }
+      __set_errno (save_errno);
       break;
 
     default:
@@ -313,4 +319,5 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
     }
 
   return retval;
+#endif
 }