Fix: double close of directory fd in runas worker
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 15 May 2019 15:37:55 +0000 (11:37 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 25 Jul 2019 19:45:26 +0000 (15:45 -0400)
The run-as worker implements its mkdirat and mkdirat_recursive commands
on top of the lttng_directory_handle interface. When a directory
handle is created from a directory file descriptor, it assumes the
ownership of this file descriptor and it will release it when
lttng_directory_handle_fini() is invoked.

The runas worker's post-command clean-up closes any file descriptor
received from its client. The command structure's `fd` is set to
`-1` in order to make the received file descriptor invalid and
prevent the double-close.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/runas.c

index c77f198c4d4061adade2b550846d38efbd387cf8..45aad109a00904804a009e285a8bb829f115add9 100644 (file)
@@ -199,6 +199,8 @@ int _mkdirat_recursive(struct run_as_data *data, struct run_as_ret *ret_value)
        mode = data->u.mkdirat.mode;
 
        (void) lttng_directory_handle_init_from_dirfd(&handle, data->fd);
+       /* Ownership of dirfd is transferred to the handle. */
+       data->fd = -1;
        /* Safe to call as we have transitioned to the requested uid/gid. */
        ret_value->u.mkdirat.ret =
                        lttng_directory_handle_create_subdirectory_recursive(
@@ -220,6 +222,8 @@ int _mkdirat(struct run_as_data *data, struct run_as_ret *ret_value)
        mode = data->u.mkdirat.mode;
 
        (void) lttng_directory_handle_init_from_dirfd(&handle, data->fd);
+       /* Ownership of dirfd is transferred to the handle. */
+       data->fd = -1;
        /* Safe to call as we have transitioned to the requested uid/gid. */
        ret_value->u.mkdirat.ret =
                        lttng_directory_handle_create_subdirectory(
This page took 0.028442 seconds and 4 git commands to generate.