weston-launch: Use fstat to make sure we stat the right fd
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Sep 2013 05:14:09 +0000 (22:14 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Sep 2013 05:14:09 +0000 (22:14 -0700)
Instead of the racy stat+open, open first and then use fstat.  We want to
make sure we're stating the fd we'll be sending to weston and nothing else.

src/weston-launch.c

index 059010c..05f15c1 100644 (file)
@@ -280,9 +280,6 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
        /* Ensure path is null-terminated */
        ((char *) message)[len-1] = '\0';
 
-       if (stat(message->path, &s) < 0)
-               goto err0;
-
        fd = open(message->path, message->flags);
        if (fd < 0) {
                fprintf(stderr, "Error opening device %s: %m\n",
@@ -290,6 +287,13 @@ handle_open(struct weston_launch *wl, struct msghdr *msg, ssize_t len)
                goto err0;
        }
 
+       if (fstat(fd, &s) < 0) {
+               close(fd);
+               fd = -1;
+               fprintf(stderr, "Failed to stat %s\n", message->path);
+               goto err0;
+       }
+
        if (major(s.st_rdev) != INPUT_MAJOR &&
            major(s.st_rdev) != DRM_MAJOR) {
                close(fd);