X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Frunas.c;h=c1d07b3a5e7e16f759540603ceb10efeea14fe79;hb=d92d258f48168978efe96ac77393801c887bed81;hp=5ab42717a9058b4a5083516aa142a3c1efda226d;hpb=8f0044bfed9f5ca51eab51478f483f92cc8f84a7;p=lttng-tools.git diff --git a/src/common/runas.c b/src/common/runas.c index 5ab42717a..c1d07b3a5 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -77,6 +77,10 @@ struct run_as_open_data { mode_t mode; }; +struct run_as_unlink_data { + const char *path; +}; + #ifdef VALGRIND static int use_clone(void) @@ -91,6 +95,9 @@ int use_clone(void) } #endif +LTTNG_HIDDEN +int _utils_mkdir_recursive_unsafe(const char *path, mode_t mode); + /* * Create recursively directory using the FULL path. */ @@ -104,7 +111,8 @@ int _mkdir_recursive(void *_data) path = data->path; mode = data->mode; - return utils_mkdir_recursive(path, mode); + /* Safe to call as we have transitioned to the requested uid/gid. */ + return _utils_mkdir_recursive_unsafe(path, mode); } static @@ -128,6 +136,20 @@ int _open(void *_data) return open(data->path, data->flags, data->mode); } +static +int _unlink(void *_data) +{ + int ret; + struct run_as_unlink_data *data = _data; + + ret = unlink(data->path); + if (ret < 0) { + ret = -errno; + } + + return ret; +} + static int child_run_as(void *_data) { @@ -339,3 +361,14 @@ int run_as_open(const char *path, int flags, mode_t mode, uid_t uid, gid_t gid) data.mode = mode; return run_as(_open, &data, uid, gid); } + +LTTNG_HIDDEN +int run_as_unlink(const char *path, uid_t uid, gid_t gid) +{ + struct run_as_unlink_data data; + + DBG3("unlink() %s with for uid %d and gid %d", + path, uid, gid); + data.path = path; + return run_as(_unlink, &data, uid, gid); +}