uwrap: First do garbage collection before exporting ids
[uid_wrapper.git] / src / uid_wrapper.c
index 8ed717ca4d1c2752cff3576965e6fc7512462f4b..a48cc3bda275597cec8126c14446ef5e747e0f0d 100644 (file)
@@ -825,7 +825,7 @@ static void uwrap_export_ids(struct uwrap_thread *id)
 {
        char groups_str[GROUP_STRING_SIZE] = {0};
        size_t groups_str_size = sizeof(groups_str);
-       char unsigned_str[32] = {0};
+       char unsigned_str[16] = {0}; /* We need 10 + 1 (+ 1) */
        int i;
 
        /* UIDS */
@@ -851,35 +851,51 @@ static void uwrap_export_ids(struct uwrap_thread *id)
        if (id->ngroups > GROUP_MAX_COUNT) {
                UWRAP_LOG(UWRAP_LOG_ERROR,
                          "ERROR: Number of groups (%u) exceeds maximum value "
-                         "uid_wrapper will handle (%u).",
+                         "uid_wrapper can handle (%u).",
                          id->ngroups,
                          GROUP_MAX_COUNT);
                exit(-1);
        }
 
        /* GROUPS */
-       snprintf(unsigned_str, sizeof(unsigned_str), "%u", id->ngroups);
-       setenv("UID_WRAPPER_INITIAL_GROUPS_COUNT", unsigned_str, 1);
-
        for (i = 0; i < id->ngroups; i++) {
                size_t groups_str_len = strlen(groups_str);
-               size_t groups_str_avail = groups_str_size - groups_str_len;
-               size_t len;
+               size_t groups_str_avail = groups_str_size - groups_str_len - 1;
+               int len;
 
                len = snprintf(unsigned_str, sizeof(unsigned_str), ",%u", id->groups[i]);
                if (len <= 1) {
-                       continue;
+                       UWRAP_LOG(UWRAP_LOG_ERROR,
+                                 "snprintf failed for groups[%d]=%u",
+                                 i,
+                                 id->groups[i]);
+                       break;
+               }
+               if (((size_t)len) >= groups_str_avail) {
+                       UWRAP_LOG(UWRAP_LOG_ERROR,
+                                 "groups env string is to small for %d groups",
+                                 i);
+                       break;
                }
-               if (len < groups_str_avail) {
-                       snprintf(groups_str + groups_str_len,
-                                groups_str_size - groups_str_len,
-                                "%s",
-                                i == 0 ? unsigned_str + 1 : unsigned_str);
+
+               len = snprintf(groups_str + groups_str_len,
+                              groups_str_size - groups_str_len,
+                              "%s",
+                              i == 0 ? unsigned_str + 1 : unsigned_str);
+               if (len < 1) {
+                       UWRAP_LOG(UWRAP_LOG_ERROR,
+                                 "snprintf failed to create groups string at groups[%d]=%u",
+                                 i,
+                                 id->groups[i]);
+                       break;
                }
        }
 
-       if (id->ngroups > 0) {
+       if (id->ngroups == i) {
                setenv("UID_WRAPPER_INITIAL_GROUPS", groups_str, 1);
+
+               snprintf(unsigned_str, sizeof(unsigned_str), "%u", id->ngroups);
+               setenv("UID_WRAPPER_INITIAL_GROUPS_COUNT", unsigned_str, 1);
        }
 }
 
@@ -929,8 +945,6 @@ static void uwrap_thread_child(void)
                return;
        }
 
-       uwrap_export_ids(id);
-
        /*
         * "Garbage collector" - Inspired by DESTRUCTOR.
         * All threads (except one which called fork()) are dead now.. Dave
@@ -951,6 +965,8 @@ static void uwrap_thread_child(void)
                u = uwrap.ids;
        }
 
+       uwrap_export_ids(id);
+
        id->enabled = true;
 
        UWRAP_UNLOCK_ALL;
@@ -1050,8 +1066,8 @@ static void uwrap_init_env(struct uwrap_thread *id)
                if (i != ngroups) {
                        UWRAP_LOG(UWRAP_LOG_ERROR,
                                  "ERROR: The number of groups (%u) passed, "
-                                 "does not the number of groups (%u) we "
-                                 "parsed",
+                                 "does not match the number of groups (%u) "
+                                 "we parsed.",
                                  ngroups,
                                  i);
                        exit(-1);