aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libzutil/os
diff options
context:
space:
mode:
authorнаб <[email protected]>2021-04-08 22:17:38 +0200
committerBrian Behlendorf <[email protected]>2021-04-11 15:45:59 -0700
commit10b575d04cda376489f0102c36bb59e8edbfc186 (patch)
treec46da9a48f9199eede9b16881b7c7997c3a70d58 /lib/libzutil/os
parent92ffd87aafd2cf35f82acec01513e16e9ed4edd6 (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/libzutil/os')
-rw-r--r--lib/libzutil/os/freebsd/zutil_import_os.c2
-rw-r--r--lib/libzutil/os/linux/zutil_device_path_os.c2
-rw-r--r--lib/libzutil/os/linux/zutil_import_os.c4
3 files changed, 4 insertions, 4 deletions
diff --git a/lib/libzutil/os/freebsd/zutil_import_os.c b/lib/libzutil/os/freebsd/zutil_import_os.c
index ff2c0789b..36c4d90aa 100644
--- a/lib/libzutil/os/freebsd/zutil_import_os.c
+++ b/lib/libzutil/os/freebsd/zutil_import_os.c
@@ -127,7 +127,7 @@ zpool_open_func(void *arg)
/*
* O_NONBLOCK so we don't hang trying to open things like serial ports.
*/
- if ((fd = open(rn->rn_name, O_RDONLY|O_NONBLOCK)) < 0)
+ if ((fd = open(rn->rn_name, O_RDONLY|O_NONBLOCK|O_CLOEXEC)) < 0)
return;
/*
diff --git a/lib/libzutil/os/linux/zutil_device_path_os.c b/lib/libzutil/os/linux/zutil_device_path_os.c
index 1f767bb7a..1775a45c6 100644
--- a/lib/libzutil/os/linux/zutil_device_path_os.c
+++ b/lib/libzutil/os/linux/zutil_device_path_os.c
@@ -390,7 +390,7 @@ zfs_dev_is_whole_disk(const char *dev_name)
struct dk_gpt *label;
int fd;
- if ((fd = open(dev_name, O_RDONLY | O_DIRECT)) < 0)
+ if ((fd = open(dev_name, O_RDONLY | O_DIRECT | O_CLOEXEC)) < 0)
return (B_FALSE);
if (efi_alloc_and_init(fd, EFI_NUMPAR, &label) != 0) {
diff --git a/lib/libzutil/os/linux/zutil_import_os.c b/lib/libzutil/os/linux/zutil_import_os.c
index 2e0baecb3..61c42cf2e 100644
--- a/lib/libzutil/os/linux/zutil_import_os.c
+++ b/lib/libzutil/os/linux/zutil_import_os.c
@@ -136,9 +136,9 @@ zpool_open_func(void *arg)
* cache which may be stale for multipath devices. An EINVAL errno
* indicates O_DIRECT is unsupported so fallback to just O_RDONLY.
*/
- fd = open(rn->rn_name, O_RDONLY | O_DIRECT);
+ fd = open(rn->rn_name, O_RDONLY | O_DIRECT | O_CLOEXEC);
if ((fd < 0) && (errno == EINVAL))
- fd = open(rn->rn_name, O_RDONLY);
+ fd = open(rn->rn_name, O_RDONLY | O_CLOEXEC);
if ((fd < 0) && (errno == EACCES))
hdl->lpc_open_access_error = B_TRUE;
if (fd < 0)