{
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 */
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);
}
}
return;
}
- uwrap_export_ids(id);
-
/*
* "Garbage collector" - Inspired by DESTRUCTOR.
* All threads (except one which called fork()) are dead now.. Dave
u = uwrap.ids;
}
+ uwrap_export_ids(id);
+
id->enabled = true;
UWRAP_UNLOCK_ALL;
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);