launcher-util: Force all weston_launcher_open()s to use O_CLOEXEC
authorDerek Foreman <derekf@osg.samsung.com>
Fri, 1 May 2015 16:46:36 +0000 (11:46 -0500)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 15 May 2015 15:02:14 +0000 (18:02 +0300)
Really, there's pretty much no time we'd ever want O_CLOEXEC unset,
as it will likely result in leaking fds to processes that aren't
interested in them or shouldn't have them.

This also removes the (now unused) code from weston_logind_open() that
could drop O_CLOEXEC.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
src/launcher-util.c
src/logind-util.c

index 00cb935f5b3efca022f6070f85a0e98915bd6bee..ea99314904fc85570c24f86a55988759a2ad2b59 100644 (file)
@@ -114,11 +114,17 @@ weston_launcher_open(struct weston_launcher *launcher,
        struct weston_launcher_open *message;
        struct stat s;
 
+       /* We really don't want to be leaking fds to child processes so
+        * we force this flag here.  If someone comes up with a legitimate
+        * reason to not CLOEXEC they'll need to unset the flag manually.
+        */
+       flags |= O_CLOEXEC;
+
        if (launcher->logind)
                return weston_logind_open(launcher->logind, path, flags);
 
        if (launcher->fd == -1) {
-               fd = open(path, flags | O_CLOEXEC);
+               fd = open(path, flags);
                if (fd == -1)
                        return -1;
 
index e4e20ebba4e80aa2b2a28aaac03b54632019b620..f6514f1c1e7914feb9aac9a3641fce0efec5fd99 100644 (file)
@@ -186,8 +186,8 @@ weston_logind_open(struct weston_logind *wl, const char *path,
         * directly. Instead, logind passes us an fd with sane default modes.
         * For DRM and evdev this means O_RDWR | O_CLOEXEC. If we want
         * something else, we need to change it afterwards. We currently
-        * only support dropping FD_CLOEXEC and setting O_NONBLOCK. Changing
-        * access-modes is not possible so accept whatever logind passes us. */
+        * only support setting O_NONBLOCK. Changing access-modes is not
+        * possible so accept whatever logind passes us. */
 
        fl = fcntl(fd, F_GETFL);
        if (fl < 0) {
@@ -203,22 +203,6 @@ weston_logind_open(struct weston_logind *wl, const char *path,
                r = -errno;
                goto err_close;
        }
-
-       fl = fcntl(fd, F_GETFD);
-       if (fl < 0) {
-               r = -errno;
-               goto err_close;
-       }
-
-       if (!(flags & O_CLOEXEC))
-               fl &= ~FD_CLOEXEC;
-
-       r = fcntl(fd, F_SETFD, fl);
-       if (r < 0) {
-               r = -errno;
-               goto err_close;
-       }
-
        return fd;
 
 err_close: