Fix: runas: less-than-zero comparison of an unsigned value
[lttng-tools.git] / src / common / runas.c
index ab43423b1a3fd86ff798d45fb825a4b6e2392dba..ab5fb589117597162369044d6e549f43efde2194 100644 (file)
@@ -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);
@@ -1101,8 +1104,8 @@ int handle_one_cmd(struct run_as_worker *worker)
        ssize_t readlen, writelen;
        struct run_as_ret sendret = {};
        run_as_fct cmd;
-       uid_t prev_ruid;
-       gid_t prev_rgid;
+       const uid_t prev_ruid = getuid();
+       const gid_t prev_rgid = getgid();
 
        /*
         * Stage 1: Receive run_as_data struct from the master.
@@ -1140,9 +1143,6 @@ int handle_one_cmd(struct run_as_worker *worker)
                goto end;
        }
 
-       prev_ruid = getuid();
-       prev_rgid = getgid();
-
        ret = demote_creds(prev_ruid, prev_rgid, data.uid, data.gid);
        if (ret < 0) {
                goto write_return;
This page took 0.024387 seconds and 4 git commands to generate.