add O_CLOEXEC fallback for open and related functions
authorRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 19:42:42 +0000 (15:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 6 Jun 2014 19:42:42 +0000 (15:42 -0400)
since there is no easy way to detect whether open honored or ignored
the O_CLOEXEC flag, the optimal solution to providing a fallback is
simply to make the fcntl syscall to set the close-on-exec flag
immediately after open returns.

src/fcntl/open.c
src/stdio/__fopen_rb_ca.c
src/stdio/fopen.c

index 0594ed7e695578279b620120b2e4df77342082f0..088a28f74b6212cd9bd9ec2083d1245abf7e989d 100644 (file)
@@ -10,7 +10,12 @@ int open(const char *filename, int flags, ...)
        va_start(ap, flags);
        mode = va_arg(ap, mode_t);
        va_end(ap);
-       return sys_open_cp(filename, flags, mode);
+
+       int fd = __sys_open_cp(filename, flags, mode);
+       if (fd>=0 && (flags & O_CLOEXEC))
+               __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
+
+       return __syscall_ret(fd);
 }
 
 LFS64(open);
index b72c630414d2f43ac8d0e880dd05c1f534c3ec00..183a5d553895537199ca452bc593ea69ea77e146 100644 (file)
@@ -8,6 +8,7 @@ FILE *__fopen_rb_ca(const char *filename, FILE *f, unsigned char *buf, size_t le
 
        f->fd = sys_open(filename, O_RDONLY|O_CLOEXEC);
        if (f->fd < 0) return 0;
+       __syscall(SYS_fcntl, f->fd, F_SETFD, FD_CLOEXEC);
 
        f->flags = F_NOWR | F_PERM;
        f->buf = buf + UNGET;
index 3d97cfa826301b28e7692d10bff833205abc01fb..07bdb6e866d163ee2404b266161395075125f269 100644 (file)
@@ -20,6 +20,8 @@ FILE *fopen(const char *restrict filename, const char *restrict mode)
 
        fd = sys_open_cp(filename, flags, 0666);
        if (fd < 0) return 0;
+       if (flags & O_CLOEXEC)
+               __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC);
 
        f = __fdopen(fd, mode);
        if (f) return f;