mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 02:40:08 +00:00
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.
This commit is contained in:
parent
52ce486045
commit
d755bba40f
10
ChangeLog
10
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]
|
||||
|
3
NEWS
3
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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user