MFV r316873: 7233 dir_is_empty should open directory with CLOEXEC
illumos/illumos-gate@d420209d9c
d420209d9c
https://www.illumos.org/issues/7233
This fixes a race where one thread is executing zfs_mount() while another
thread forks and execs. If the fork occurs while the directory is open, the
child process will inherit (but not necessarily close immediately) the open fd
for the directory, preventing the mount.
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Author: Alex Reece <alex@delphix.com>
This commit is contained in:
commit
c2e79753fe
@ -22,7 +22,7 @@
|
||||
/*
|
||||
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2014, 2015 by Delphix. All rights reserved.
|
||||
* Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
|
||||
* Copyright 2017 Joyent, Inc.
|
||||
* Copyright 2017 RackTop Systems.
|
||||
@ -67,6 +67,7 @@
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <libgen.h>
|
||||
#include <libintl.h>
|
||||
#include <stdio.h>
|
||||
@ -187,9 +188,16 @@ dir_is_empty(const char *dirname)
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent64 *dp;
|
||||
int dirfd;
|
||||
|
||||
if ((dirp = opendir(dirname)) == NULL)
|
||||
if ((dirfd = openat(AT_FDCWD, dirname,
|
||||
O_RDONLY | O_NDELAY | O_LARGEFILE | O_CLOEXEC, 0)) < 0) {
|
||||
return (B_TRUE);
|
||||
}
|
||||
|
||||
if ((dirp = fdopendir(dirfd)) == NULL) {
|
||||
return (B_TRUE);
|
||||
}
|
||||
|
||||
while ((dp = readdir64(dirp)) != NULL) {
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user