aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libutil/util.c31
1 files changed, 26 insertions, 5 deletions
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);