uwrap: Improve groups string creation
authorAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Jul 2017 13:57:34 +0000 (15:57 +0200)
committerAndreas Schneider <asn@samba.org>
Fri, 21 Jul 2017 15:19:39 +0000 (17:19 +0200)
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
src/uid_wrapper.c

index c31d7c1f51286b7dd684580cfc4c023e7e852a68..bf3b3336a7fb006a70488fe51f763429820734ed 100644 (file)
@@ -858,28 +858,44 @@ static void uwrap_export_ids(struct uwrap_thread *id)
        }
 
        /* 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 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 (((size_t)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);
        }
 }