Depending on the flags passed, fcntl must be called with F_SETFD or
F_SETFL. This fix checks the flag passed and ensure it is valid and
calls fcntl with the right parameter.

Also, for CLOEXEC, we need to pass FD_CLOEXEC, not O_CLOEXEC.

Signed-off-by: Julien Desfossez <[email protected]>
---
 src/bin/lttng-sessiond/notification-thread.c |  2 +-
 src/common/pipe.c                            | 25 ++++++++++++++++++++++---
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/bin/lttng-sessiond/notification-thread.c 
b/src/bin/lttng-sessiond/notification-thread.c
index c47b365..3ef7df1 100644
--- a/src/bin/lttng-sessiond/notification-thread.c
+++ b/src/bin/lttng-sessiond/notification-thread.c
@@ -96,7 +96,7 @@ struct notification_thread_handle 
*notification_thread_handle_create(
                goto end;
        }
 
-       event_pipe = lttng_pipe_open(O_CLOEXEC);
+       event_pipe = lttng_pipe_open(FD_CLOEXEC);
        if (!event_pipe) {
                ERR("event_pipe creation");
                goto error;
diff --git a/src/common/pipe.c b/src/common/pipe.c
index 4220a40..4fe45ef 100644
--- a/src/common/pipe.c
+++ b/src/common/pipe.c
@@ -154,9 +154,28 @@ static int _pipe_set_flags(struct lttng_pipe *pipe, int 
flags)
        }
 
        for (i = 0; i < 2; i++) {
-               ret = fcntl(pipe->fd[i], F_SETFD, flags);
-               if (ret < 0) {
-                       PERROR("fcntl lttng pipe %d", flags);
+               if (flags & O_NONBLOCK) {
+                       ret = fcntl(pipe->fd[i], F_SETFL, O_NONBLOCK);
+                       if (ret < 0) {
+                               PERROR("fcntl lttng pipe %d", flags);
+                               goto end;
+                       }
+               }
+               if (flags & FD_CLOEXEC) {
+                       ret = fcntl(pipe->fd[i], F_SETFD, FD_CLOEXEC);
+                       if (ret < 0) {
+                               PERROR("fcntl lttng pipe %d", flags);
+                               goto end;
+                       }
+               }
+               /*
+                * We only check for O_NONBLOCK or FD_CLOEXEC, if another flag 
is
+                * needed, we can add it, but for now just make sure we don't 
make
+                * mistakes with the parameters we pass.
+                */
+               if (!(flags & O_NONBLOCK) && !(flags & FD_CLOEXEC)) {
+                       fprintf(stderr, "Unsupported flag\n");
+                       ret = -1;
                        goto end;
                }
        }
-- 
2.7.4

_______________________________________________
lttng-dev mailing list
[email protected]
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to