From: Francis Deslauriers Date: Fri, 6 Aug 2021 13:40:20 +0000 (-0400) Subject: Fix: runas: less-than-zero comparison of an unsigned value X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=222b673439b41e9efef1d306408968cc04b2d26e Fix: runas: less-than-zero comparison of an unsigned value Fixes two defects found by Coverity related to unsigned integers being treated as signed. Reported by Coverity: CID 1461333: Control flow issues (NO_EFFECT) This less-than-zero comparison of an unsigned value is never true. "buf_size < 0UL". CID 1461332: Integer handling issues (NEGATIVE_RETURNS) "buf_size" is passed to a parameter that cannot be negative. Signed-off-by: Francis Deslauriers Signed-off-by: Jérémie Galarneau Change-Id: Id6d4a71960f2ef34f14c05e66ef5d934b7a3e524 --- diff --git a/src/common/runas.c b/src/common/runas.c index db95429b4..ab5fb5891 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -907,14 +907,15 @@ static int get_user_infos_from_uid( { int ret; char *buf = NULL; - size_t buf_size; + long raw_get_pw_buf_size; + size_t get_pw_buf_size; struct passwd pwd; struct passwd *result = NULL; /* Fetch the max size for the temporary buffer. */ errno = 0; - buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); - if (buf_size < 0) { + raw_get_pw_buf_size = sysconf(_SC_GETPW_R_SIZE_MAX); + if (raw_get_pw_buf_size < 0) { if (errno != 0) { PERROR("Failed to query _SC_GETPW_R_SIZE_MAX"); goto error; @@ -923,16 +924,18 @@ static int get_user_infos_from_uid( /* Limit is indeterminate. */ WARN("Failed to query _SC_GETPW_R_SIZE_MAX as it is " "indeterminate; falling back to default buffer size"); - buf_size = GETPW_BUFFER_FALLBACK_SIZE; + raw_get_pw_buf_size = GETPW_BUFFER_FALLBACK_SIZE; } - buf = zmalloc(buf_size); + get_pw_buf_size = (size_t) raw_get_pw_buf_size; + + buf = zmalloc(get_pw_buf_size); if (buf == NULL) { PERROR("Failed to allocate buffer to get password file entries"); goto error; } - ret = getpwuid_r(uid, &pwd, buf, buf_size, &result); + ret = getpwuid_r(uid, &pwd, buf, get_pw_buf_size, &result); if (ret < 0) { PERROR("Failed to get user information for user: uid = %d", (int) uid);