X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=a91ede65c84af5d5c1d01797dc5766ee7e16057b;hb=eafef9ebb1eb94515356250010370703b85f38a0;hp=5be67c11f1e1dc896fa2e5d5e9cb7a6299903c73;hpb=18710679a8ac57fda5dbd26cf16bb180dce9e286;p=lttng-tools.git diff --git a/src/common/utils.c b/src/common/utils.c index 5be67c11f..a91ede65c 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include "utils.h" @@ -678,16 +679,20 @@ int utils_mkdir(const char *path, mode_t mode, int uid, int gid) { int ret; struct lttng_directory_handle handle; - struct lttng_credentials creds = { + const struct lttng_credentials creds = { .uid = (uid_t) uid, .gid = (gid_t) gid, }; - (void) lttng_directory_handle_init(&handle, NULL); + ret = lttng_directory_handle_init(&handle, NULL); + if (ret) { + goto end; + } ret = lttng_directory_handle_create_subdirectory_as_user( &handle, path, mode, (uid >= 0 || gid >= 0) ? &creds : NULL); lttng_directory_handle_fini(&handle); +end: return ret; } @@ -702,16 +707,20 @@ int utils_mkdir_recursive(const char *path, mode_t mode, int uid, int gid) { int ret; struct lttng_directory_handle handle; - struct lttng_credentials creds = { + const struct lttng_credentials creds = { .uid = (uid_t) uid, .gid = (gid_t) gid, }; - (void) lttng_directory_handle_init(&handle, NULL); + ret = lttng_directory_handle_init(&handle, NULL); + if (ret) { + goto end; + } ret = lttng_directory_handle_create_subdirectory_recursive_as_user( &handle, path, mode, (uid >= 0 || gid >= 0) ? &creds : NULL); lttng_directory_handle_fini(&handle); +end: return ret; } @@ -1374,24 +1383,77 @@ size_t utils_get_current_time_str(const char *format, char *dst, size_t len) } /* - * Return the group ID matching name, else 0 if it cannot be found. + * Return 0 on success and set *gid to the group_ID matching the passed name. + * Else -1 if it cannot be found or an error occurred. */ LTTNG_HIDDEN -gid_t utils_get_group_id(const char *name) +int utils_get_group_id(const char *name, bool warn, gid_t *gid) { - struct group *grp; + static volatile int warn_once; + int ret; + long sys_len; + size_t len; + struct group grp; + struct group *result; + struct lttng_dynamic_buffer buffer; + + /* Get the system limit, if it exists. */ + sys_len = sysconf(_SC_GETGR_R_SIZE_MAX); + if (sys_len == -1) { + len = 1024; + } else { + len = (size_t) sys_len; + } - grp = getgrnam(name); - if (!grp) { - static volatile int warn_once; + lttng_dynamic_buffer_init(&buffer); + ret = lttng_dynamic_buffer_set_size(&buffer, len); + if (ret) { + ERR("Failed to allocate group info buffer"); + ret = -1; + goto error; + } + + while ((ret = getgrnam_r(name, &grp, buffer.data, buffer.size, &result)) == ERANGE) { + const size_t new_len = 2 * buffer.size; - if (!warn_once) { - WARN("No tracing group detected"); - warn_once = 1; + /* Buffer is not big enough, increase its size. */ + if (new_len < buffer.size) { + ERR("Group info buffer size overflow"); + ret = -1; + goto error; } - return 0; + + ret = lttng_dynamic_buffer_set_size(&buffer, new_len); + if (ret) { + ERR("Failed to grow group info buffer to %zu bytes", + new_len); + ret = -1; + goto error; + } + } + if (ret) { + PERROR("Failed to get group file entry for group name \"%s\"", + name); + ret = -1; + goto error; + } + + /* Group not found. */ + if (!result) { + ret = -1; + goto error; } - return grp->gr_gid; + + *gid = result->gr_gid; + ret = 0; + +error: + if (ret && warn && !warn_once) { + WARN("No tracing group detected"); + warn_once = 1; + } + lttng_dynamic_buffer_reset(&buffer); + return ret; } /*