diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-07-25 08:38:23 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-07-25 08:38:23 +0100 |
commit | d0a8583ef8638704aea83cdaa0bcdcce3656631b (patch) | |
tree | 0a2dbe1269aac5a3e2ee52cd6313853161d63c6b | |
parent | 8928b8b830eb596369e7a6297a299c047970b4dd (diff) | |
download | rspamd-d0a8583ef8638704aea83cdaa0bcdcce3656631b.tar.gz rspamd-d0a8583ef8638704aea83cdaa0bcdcce3656631b.zip |
[Fix] Set CLOEXEC flag on files opened
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/libutil/util.c | 31 |
2 files changed, 27 insertions, 5 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f0dee1328..c5f874375 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1001,6 +1001,7 @@ CHECK_SYMBOL_EXISTS(SOCK_SEQPACKET "sys/types.h;sys/socket.h" HAVE_SOCK_SEQPACKE CHECK_SYMBOL_EXISTS(I_SETSIG "sys/types.h;sys/ioctl.h" HAVE_SETSIG) CHECK_SYMBOL_EXISTS(O_ASYNC "sys/types.h;sys/fcntl.h" HAVE_OASYNC) CHECK_SYMBOL_EXISTS(O_NOFOLLOW "sys/types.h;sys/fcntl.h" HAVE_ONOFOLLOW) +CHECK_SYMBOL_EXISTS(O_CLOEXEC "sys/types.h;sys/fcntl.h" HAVE_OCLOEXEC) LIST(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSL_INCLUDE}") CHECK_SYMBOL_EXISTS(SSL_set_tlsext_host_name "openssl/ssl.h" HAVE_SSL_TLSEXT_HOSTNAME) CHECK_SYMBOL_EXISTS(dirfd "sys/types.h;unistd.h;dirent.h" HAVE_DIRFD) diff --git a/src/libutil/util.c b/src/libutil/util.c index 593baf522..86f1f24f6 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -2422,7 +2422,7 @@ rspamd_file_xopen (const char *fname, int oflags, guint mode, gboolean allow_symlink) { struct stat sb; - int fd; + int fd, flags = oflags; if (lstat (fname, &sb) == -1) { @@ -2431,18 +2431,39 @@ rspamd_file_xopen (const char *fname, int oflags, guint mode, } } else if (!S_ISREG (sb.st_mode)) { - return -1; + if (S_ISLNK (sb.st_mode)) { + if (!allow_symlink) { + return -1; + } + } + else { + return -1; + } } +#ifdef HAVE_OCLOEXEC + flags |= O_CLOEXEC; +#endif + #ifdef HAVE_ONOFOLLOW if (!allow_symlink) { - fd = open (fname, oflags | O_NOFOLLOW, mode); + flags |= O_NOFOLLOW; + fd = open (fname, flags, mode); } else { - fd = open (fname, oflags, mode); + fd = open (fname, flags, mode); } #else - fd = open (fname, oflags, mode); + fd = open (fname, flags, mode); +#endif + +#ifndef HAVE_OCLOEXEC + if (fcntl (fd, F_SETFD, FD_CLOEXEC) == -1) { + msg_warn ("fcntl failed: %d, '%s'", errno, strerror (errno)); + close (fd); + + return -1; + } #endif return (fd); |