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>
mode = data->u.mkdirat.mode;
(void) lttng_directory_handle_init_from_dirfd(&handle, data->fd);
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(
/* Safe to call as we have transitioned to the requested uid/gid. */
ret_value->u.mkdirat.ret =
lttng_directory_handle_create_subdirectory_recursive(
mode = data->u.mkdirat.mode;
(void) lttng_directory_handle_init_from_dirfd(&handle, data->fd);
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(
/* Safe to call as we have transitioned to the requested uid/gid. */
ret_value->u.mkdirat.ret =
lttng_directory_handle_create_subdirectory(