OpenZFS 7233 - dir_is_empty should open directory with CLOEXEC

Authored by: Alex Reece <alex@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Ported-by: George Melikov mail@gmelikov.ru

OpenZFS-issue: https://www.illumos.org/issues/7233
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/d420209
Closes #5623
This commit is contained in:
George Melikov 2017-01-23 21:07:09 +03:00 committed by Brian Behlendorf
parent e67a7ffb5d
commit 3cbe6b29f5
1 changed files with 10 additions and 2 deletions

View File

@ -22,7 +22,7 @@
/* /*
* Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. 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.
*/ */
/* /*
@ -64,6 +64,7 @@
#include <dirent.h> #include <dirent.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <libgen.h> #include <libgen.h>
#include <libintl.h> #include <libintl.h>
#include <stdio.h> #include <stdio.h>
@ -179,9 +180,16 @@ dir_is_empty(const char *dirname)
{ {
DIR *dirp; DIR *dirp;
struct dirent64 *dp; 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); return (B_TRUE);
}
if ((dirp = fdopendir(dirfd)) == NULL) {
return (B_TRUE);
}
while ((dp = readdir64(dirp)) != NULL) { while ((dp = readdir64(dirp)) != NULL) {