svn commit: r329659 - head/cddl/contrib/opensolaris/lib/libzfs/common

Alexander Motin mav at FreeBSD.org
Tue Feb 20 20:17:20 UTC 2018


Author: mav
Date: Tue Feb 20 20:17:19 2018
New Revision: 329659
URL: https://svnweb.freebsd.org/changeset/base/329659

Log:
  MFV r316873: 7233 dir_is_empty should open directory with CLOEXEC
  
  illumos/illumos-gate at d420209d9c807f782c1d31f5683be74798142198
  https://github.com/illumos/illumos-gate/commit/d420209d9c807f782c1d31f5683be74798142198
  
  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 at delphix.com>
  Reviewed by: Paul Dagnelie <pcd at delphix.com>
  Approved by: Richard Lowe <richlowe at richlowe.net>
  Author: Alex Reece <alex at delphix.com>

Modified:
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_mount.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_mount.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_mount.c	Tue Feb 20 20:14:11 2018	(r329658)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_mount.c	Tue Feb 20 20:17:19 2018	(r329659)
@@ -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 at 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) {
 


More information about the svn-src-all mailing list