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
