diff options
author | наб <[email protected]> | 2021-04-08 22:17:38 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2021-04-11 15:45:59 -0700 |
commit | 10b575d04cda376489f0102c36bb59e8edbfc186 (patch) | |
tree | c46da9a48f9199eede9b16881b7c7997c3a70d58 /lib/libzfs/libzfs_pool.c | |
parent | 92ffd87aafd2cf35f82acec01513e16e9ed4edd6 (diff) |
lib/: set O_CLOEXEC on all fds
As found by
git grep -E '(open|setmntent|pipe2?)\(' |
grep -vE '((zfs|zpool)_|fd|dl|lzc_re|pidfile_|g_)open\('
FreeBSD's pidfile_open() says nothing about the flags of the files it
opens, but we can't do anything about it anyway; the implementation does
open all files with O_CLOEXEC
Consider this output with zpool.d/media appended with
"pid=$$; (ls -l /proc/$pid/fd > /dev/tty)":
$ /sbin/zpool iostat -vc media
lrwx------ 0 -> /dev/pts/0
l-wx------ 1 -> 'pipe:[3278500]'
l-wx------ 2 -> /dev/null
lrwx------ 3 -> /dev/zfs
lr-x------ 4 -> /proc/31895/mounts
lrwx------ 5 -> /dev/zfs
lr-x------ 10 -> /usr/lib/zfs-linux/zpool.d/media
vs
$ ./zpool iostat -vc vendor,upath,iostat,media
lrwx------ 0 -> /dev/pts/0
l-wx------ 1 -> 'pipe:[3279887]'
l-wx------ 2 -> /dev/null
lr-x------ 10 -> /usr/lib/zfs-linux/zpool.d/media
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ahelenia Ziemiańska <[email protected]>
Closes #11866
Diffstat (limited to 'lib/libzfs/libzfs_pool.c')
-rw-r--r-- | lib/libzfs/libzfs_pool.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index 9ef97cd67..12de6887d 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -4809,13 +4809,11 @@ zpool_load_compat(const char *compatibility, * as they're only needed if the filename is relative * which will be checked during the openat(). */ -#ifdef O_PATH - sdirfd = open(ZPOOL_SYSCONF_COMPAT_D, O_DIRECTORY | O_PATH); - ddirfd = open(ZPOOL_DATA_COMPAT_D, O_DIRECTORY | O_PATH); -#else - sdirfd = open(ZPOOL_SYSCONF_COMPAT_D, O_DIRECTORY | O_RDONLY); - ddirfd = open(ZPOOL_DATA_COMPAT_D, O_DIRECTORY | O_RDONLY); +#ifndef O_PATH +#define O_PATH O_RDONLY #endif + sdirfd = open(ZPOOL_SYSCONF_COMPAT_D, O_DIRECTORY | O_PATH | O_CLOEXEC); + ddirfd = open(ZPOOL_DATA_COMPAT_D, O_DIRECTORY | O_PATH | O_CLOEXEC); (void) strlcpy(filenames, compatibility, ZFS_MAXPROPLEN); file = strtok_r(filenames, ",", &ps); |