mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
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 <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #11866
This commit is contained in:
@@ -71,7 +71,7 @@ pkcs11_get_urandom(uint8_t *buf, size_t bytes)
|
||||
int rand;
|
||||
ssize_t bytes_read = 0;
|
||||
|
||||
rand = open("/dev/urandom", O_RDONLY);
|
||||
rand = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
|
||||
if (rand < 0)
|
||||
return (rand);
|
||||
@@ -468,7 +468,7 @@ get_key_material_file(libzfs_handle_t *hdl, const char *uri,
|
||||
if (strlen(uri) < 7)
|
||||
return (EINVAL);
|
||||
|
||||
if ((f = fopen(uri + 7, "r")) == NULL) {
|
||||
if ((f = fopen(uri + 7, "re")) == NULL) {
|
||||
ret = errno;
|
||||
errno = 0;
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
|
||||
@@ -697,7 +697,7 @@ setup_differ_info(zfs_handle_t *zhp, const char *fromsnap,
|
||||
{
|
||||
di->zhp = zhp;
|
||||
|
||||
di->cleanupfd = open(ZFS_DEV, O_RDWR);
|
||||
di->cleanupfd = open(ZFS_DEV, O_RDWR | O_CLOEXEC);
|
||||
VERIFY(di->cleanupfd >= 0);
|
||||
|
||||
if (get_snapshot_names(di, fromsnap, tosnap) != 0)
|
||||
@@ -731,7 +731,7 @@ zfs_show_diffs(zfs_handle_t *zhp, int outfd, const char *fromsnap,
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (pipe(pipefd)) {
|
||||
if (pipe2(pipefd, O_CLOEXEC)) {
|
||||
zfs_error_aux(zhp->zfs_hdl, strerror(errno));
|
||||
teardown_differ_info(&di);
|
||||
return (zfs_error(zhp->zfs_hdl, EZFS_PIPEFAILED, errbuf));
|
||||
|
||||
@@ -565,7 +565,7 @@ zfs_iter_mounted(zfs_handle_t *zhp, zfs_iter_f func, void *data)
|
||||
FILE *mnttab;
|
||||
int err = 0;
|
||||
|
||||
if ((mnttab = fopen(MNTTAB, "r")) == NULL)
|
||||
if ((mnttab = fopen(MNTTAB, "re")) == NULL)
|
||||
return (ENOENT);
|
||||
|
||||
while (err == 0 && getmntent(mnttab, &entry) == 0) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2217,7 +2217,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
|
||||
++holdseq;
|
||||
(void) snprintf(sdd.holdtag, sizeof (sdd.holdtag),
|
||||
".send-%d-%llu", getpid(), (u_longlong_t)holdseq);
|
||||
sdd.cleanup_fd = open(ZFS_DEV, O_RDWR);
|
||||
sdd.cleanup_fd = open(ZFS_DEV, O_RDWR | O_CLOEXEC);
|
||||
if (sdd.cleanup_fd < 0) {
|
||||
err = errno;
|
||||
goto stderr_out;
|
||||
|
||||
@@ -884,13 +884,13 @@ libzfs_run_process_impl(const char *path, char *argv[], char *env[], int flags,
|
||||
* Setup a pipe between our child and parent process if we're
|
||||
* reading stdout.
|
||||
*/
|
||||
if ((lines != NULL) && pipe(link) == -1)
|
||||
if ((lines != NULL) && pipe2(link, O_CLOEXEC) == -1)
|
||||
return (-EPIPE);
|
||||
|
||||
pid = vfork();
|
||||
if (pid == 0) {
|
||||
/* Child process */
|
||||
devnull_fd = open("/dev/null", O_WRONLY);
|
||||
devnull_fd = open("/dev/null", O_WRONLY | O_CLOEXEC);
|
||||
|
||||
if (devnull_fd < 0)
|
||||
_exit(-1);
|
||||
@@ -900,15 +900,11 @@ libzfs_run_process_impl(const char *path, char *argv[], char *env[], int flags,
|
||||
else if (lines != NULL) {
|
||||
/* Save the output to lines[] */
|
||||
dup2(link[1], STDOUT_FILENO);
|
||||
close(link[0]);
|
||||
close(link[1]);
|
||||
}
|
||||
|
||||
if (!(flags & STDERR_VERBOSE))
|
||||
(void) dup2(devnull_fd, STDERR_FILENO);
|
||||
|
||||
close(devnull_fd);
|
||||
|
||||
if (flags & NO_DEFAULT_PATH) {
|
||||
if (env == NULL)
|
||||
execv(path, argv);
|
||||
@@ -1144,7 +1140,7 @@ zfs_path_to_zhandle(libzfs_handle_t *hdl, const char *path, zfs_type_t argtype)
|
||||
}
|
||||
|
||||
/* Reopen MNTTAB to prevent reading stale data from open file */
|
||||
if (freopen(MNTTAB, "r", hdl->libzfs_mnttab) == NULL)
|
||||
if (freopen(MNTTAB, "re", hdl->libzfs_mnttab) == NULL)
|
||||
return (NULL);
|
||||
|
||||
if (getextmntent(path, &entry, &statbuf) != 0)
|
||||
|
||||
@@ -62,7 +62,7 @@ zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg)
|
||||
{
|
||||
int fd, error;
|
||||
|
||||
if ((fd = open(path, O_RDWR|O_DIRECT)) < 0) {
|
||||
if ((fd = open(path, O_RDWR|O_DIRECT|O_CLOEXEC)) < 0) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot "
|
||||
"relabel '%s': unable to open device: %d"), path, errno);
|
||||
return (zfs_error(hdl, EZFS_OPENFAILED, msg));
|
||||
@@ -107,7 +107,7 @@ read_efi_label(nvlist_t *config, diskaddr_t *sb)
|
||||
|
||||
(void) snprintf(diskname, sizeof (diskname), "%s%s", DISK_ROOT,
|
||||
strrchr(path, '/'));
|
||||
if ((fd = open(diskname, O_RDONLY|O_DIRECT)) >= 0) {
|
||||
if ((fd = open(diskname, O_RDONLY|O_DIRECT|O_CLOEXEC)) >= 0) {
|
||||
struct dk_gpt *vtoc;
|
||||
|
||||
if ((err = efi_alloc_and_read(fd, &vtoc)) >= 0) {
|
||||
@@ -159,7 +159,7 @@ zpool_label_disk_check(char *path)
|
||||
struct dk_gpt *vtoc;
|
||||
int fd, err;
|
||||
|
||||
if ((fd = open(path, O_RDONLY|O_DIRECT)) < 0)
|
||||
if ((fd = open(path, O_RDONLY|O_DIRECT|O_CLOEXEC)) < 0)
|
||||
return (errno);
|
||||
|
||||
if ((err = efi_alloc_and_read(fd, &vtoc)) != 0) {
|
||||
@@ -190,7 +190,7 @@ zpool_label_name(char *label_name, int label_size)
|
||||
uint64_t id = 0;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/urandom", O_RDONLY);
|
||||
fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
if (read(fd, &id, sizeof (id)) != sizeof (id))
|
||||
id = 0;
|
||||
@@ -241,7 +241,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name)
|
||||
|
||||
(void) snprintf(path, sizeof (path), "%s/%s", DISK_ROOT, name);
|
||||
|
||||
if ((fd = open(path, O_RDWR|O_DIRECT|O_EXCL)) < 0) {
|
||||
if ((fd = open(path, O_RDWR|O_DIRECT|O_EXCL|O_CLOEXEC)) < 0) {
|
||||
/*
|
||||
* This shouldn't happen. We've long since verified that this
|
||||
* is a valid device.
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
void
|
||||
libzfs_set_pipe_max(int infd)
|
||||
{
|
||||
FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "r");
|
||||
FILE *procf = fopen("/proc/sys/fs/pipe-max-size", "re");
|
||||
|
||||
if (procf != NULL) {
|
||||
unsigned long max_psize;
|
||||
|
||||
@@ -143,7 +143,7 @@ libzfs_load_module_impl(const char *module)
|
||||
|
||||
start = gethrtime();
|
||||
do {
|
||||
fd = open(ZFS_DEV, O_RDWR);
|
||||
fd = open(ZFS_DEV, O_RDWR | O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
(void) close(fd);
|
||||
return (0);
|
||||
@@ -195,7 +195,7 @@ zfs_version_kernel(char *version, int len)
|
||||
int fd;
|
||||
int rlen;
|
||||
|
||||
if ((fd = open(ZFS_SYSFS_DIR "/version", O_RDONLY)) == -1)
|
||||
if ((fd = open(ZFS_SYSFS_DIR "/version", O_RDONLY | O_CLOEXEC)) == -1)
|
||||
return (-1);
|
||||
|
||||
if ((rlen = read(fd, version, len)) == -1) {
|
||||
|
||||
Reference in New Issue
Block a user