X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=f058e2003a440f6e1dffbf2076752abf0908c786;hp=5be67c11f1e1dc896fa2e5d5e9cb7a6299903c73;hb=69e3a560d3063497c161ae00a9875dad1d546818;hpb=18710679a8ac57fda5dbd26cf16bb180dce9e286 diff --git a/src/common/utils.c b/src/common/utils.c index 5be67c11f..f058e2003 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include "utils.h" @@ -678,7 +679,7 @@ 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, }; @@ -702,7 +703,7 @@ 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, }; @@ -1374,24 +1375,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; + } + + 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; + } - grp = getgrnam(name); - if (!grp) { - static volatile int warn_once; + 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; + } + + 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; } - return 0; } - return grp->gr_gid; + 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; + } + + *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; } /*