Siddhesh Poyarekar 901d798
commit d755bba40f880c01ced8740a26fecc85534454b9
Siddhesh Poyarekar 901d798
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Siddhesh Poyarekar 901d798
Date:   Wed Apr 3 10:56:45 2013 +0530
Siddhesh Poyarekar 901d798
Siddhesh Poyarekar 901d798
    Preserve errno across _PC_CHOWN_RESTRICTED call on XFS
Siddhesh Poyarekar 901d798
    
Siddhesh Poyarekar 901d798
    Fix BZ #15305.
Siddhesh Poyarekar 901d798
    
Siddhesh Poyarekar 901d798
    On kernel versions earlier than 2.6.29, the Linux kernel exported a
Siddhesh Poyarekar 901d798
    sysctl called restrict_chown for xfs, which could be used to allow
Siddhesh Poyarekar 901d798
    chown to users other than the owner.  2.6.29 removed this support,
Siddhesh Poyarekar 901d798
    causing the open_not_cancel_2 to fail and thus modify errno.  The fix
Siddhesh Poyarekar 901d798
    is to save and restore errno so that the caller sees it as unmodified.
Siddhesh Poyarekar 901d798
    
Siddhesh Poyarekar 901d798
    Additionally, since the code to check the sysctl is not useful on
Siddhesh Poyarekar 901d798
    newer kernels, we add an ifdef so that in future the code block gets
Siddhesh Poyarekar 901d798
    rmeoved completely.
Siddhesh Poyarekar 901d798
Siddhesh Poyarekar 901d798
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
Siddhesh Poyarekar 901d798
index 8fdff7e..ccd4c59 100644
Siddhesh Poyarekar 901d798
--- a/sysdeps/unix/sysv/linux/kernel-features.h
Siddhesh Poyarekar 901d798
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
Siddhesh Poyarekar 901d798
@@ -221,3 +221,9 @@
Siddhesh Poyarekar 901d798
 #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100
Siddhesh Poyarekar 901d798
 # define __ASSUME_GETCPU_SYSCALL	1
Siddhesh Poyarekar 901d798
 #endif
Siddhesh Poyarekar 901d798
+
Siddhesh Poyarekar 901d798
+/* 2.6.29 removed the XFS restricted_chown sysctl, so it is pointless looking
Siddhesh Poyarekar 901d798
+   for it in newer kernels.  */
Siddhesh Poyarekar 901d798
+#if __LINUX_KERNEL_VERSION >= 0x02061d
Siddhesh Poyarekar 901d798
+# define __ASSUME_XFS_RESTRICTED_CHOWN 1
Siddhesh Poyarekar 901d798
+#endif
Siddhesh Poyarekar 901d798
diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c
Siddhesh Poyarekar 901d798
index de91a45..723d234 100644
Siddhesh Poyarekar 901d798
--- a/sysdeps/unix/sysv/linux/pathconf.c
Siddhesh Poyarekar 901d798
+++ b/sysdeps/unix/sysv/linux/pathconf.c
Siddhesh Poyarekar 901d798
@@ -289,11 +289,16 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
Siddhesh Poyarekar 901d798
       return -1;
Siddhesh Poyarekar 901d798
     }
Siddhesh Poyarekar 901d798
 
Siddhesh Poyarekar 901d798
+#if __ASSUME_XFS_RESTRICTED_CHOWN
Siddhesh Poyarekar 901d798
+  return 1;
Siddhesh Poyarekar 901d798
+#else
Siddhesh Poyarekar 901d798
   int fd;
Siddhesh Poyarekar 901d798
+  int save_errno;
Siddhesh Poyarekar 901d798
   long int retval = 1;
Siddhesh Poyarekar 901d798
   switch (fsbuf->f_type)
Siddhesh Poyarekar 901d798
     {
Siddhesh Poyarekar 901d798
     case XFS_SUPER_MAGIC:
Siddhesh Poyarekar 901d798
+      save_errno = errno;
Siddhesh Poyarekar 901d798
       /* Read the value from /proc/sys/fs/xfs/restrict_chown.  If we cannot
Siddhesh Poyarekar 901d798
 	 read it default to assume the restriction is in place.  */
Siddhesh Poyarekar 901d798
       fd = open_not_cancel_2 ("/proc/sys/fs/xfs/restrict_chown", O_RDONLY);
Siddhesh Poyarekar 901d798
@@ -306,6 +311,7 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
Siddhesh Poyarekar 901d798
 
Siddhesh Poyarekar 901d798
 	  close_not_cancel_no_status (fd);
Siddhesh Poyarekar 901d798
 	}
Siddhesh Poyarekar 901d798
+      __set_errno (save_errno);
Siddhesh Poyarekar 901d798
       break;
Siddhesh Poyarekar 901d798
 
Siddhesh Poyarekar 901d798
     default:
Siddhesh Poyarekar 901d798
@@ -313,4 +319,5 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf)
Siddhesh Poyarekar 901d798
     }
Siddhesh Poyarekar 901d798
 
Siddhesh Poyarekar 901d798
   return retval;
Siddhesh Poyarekar 901d798
+#endif
Siddhesh Poyarekar 901d798
 }