You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.4 KiB
67 lines
2.4 KiB
commit d755bba40f880c01ced8740a26fecc85534454b9 |
|
Author: Siddhesh Poyarekar <siddhesh@redhat.com> |
|
Date: Wed Apr 3 10:56:45 2013 +0530 |
|
|
|
Preserve errno across _PC_CHOWN_RESTRICTED call on XFS |
|
|
|
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. |
|
|
|
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/kernel-features.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/kernel-features.h |
|
index 8fdff7e..ccd4c59 100644 |
|
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/kernel-features.h |
|
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/kernel-features.h |
|
@@ -221,3 +221,9 @@ |
|
#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 |
|
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
|
index de91a45..723d234 100644 |
|
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
|
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
|
@@ -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 |
|
}
|
|
|