Commit 21002b39 by Henrik Kjölhede

Fixed memory checks and faulty loop in get_alloted according to comments

parent 1940bff4
...@@ -97,42 +97,63 @@ static char *get_username(void) ...@@ -97,42 +97,63 @@ static char *get_username(void)
return pwd->pw_name; return pwd->pw_name;
} }
static void free_groupnames(char **groupnames)
{
char **group;
for (group=groupnames; group != NULL; group++)
free(*group);
free(groupnames);
}
static char **get_groupnames(void) static char **get_groupnames(void)
{ {
int ngroups; int ngroups;
gid_t *group_ids; gid_t *group_ids;
int ret, i, j; int ret, i;
char **groupnames; char **groupnames;
struct group *gr; struct group *gr;
ngroups = getgroups(0, NULL); ngroups = getgroups(0, NULL);
if (ngroups == -1) { if (ngroups == -1) {
fprintf(stderr, "Failed to get number of groups user belongs to\n"); fprintf(stderr, "Failed to get number of groups user belongs to: %s\n", strerror(errno));
return NULL; return NULL;
} }
if (ngroups == 0)
return NULL;
group_ids = (gid_t *)malloc(sizeof(gid_t)*ngroups); group_ids = (gid_t *)malloc(sizeof(gid_t)*ngroups);
if (group_ids == NULL) {
fprintf(stderr, "Out of memory while getting groups the user belongs to\n");
return NULL;
}
ret = getgroups(ngroups, group_ids); ret = getgroups(ngroups, group_ids);
if (ret < 0) { if (ret < 0) {
free(group_ids); free(group_ids);
fprintf(stderr, "Failed to get process groups\n"); fprintf(stderr, "Failed to get process groups: %s\n", strerror(errno));
return NULL; return NULL;
} }
groupnames = (char **)malloc(sizeof(char *)*(ngroups+1)); groupnames = (char **)malloc(sizeof(char *)*(ngroups+1));
if (groupnames == NULL) {
free(group_ids);
fprintf(stderr, "Out of memory while getting group names\n");
return NULL;
}
memset(groupnames, 0, sizeof(char *)*(ngroups+1));
for (i=0; i<ngroups; i++ ) { for (i=0; i<ngroups; i++ ) {
gr = getgrgid(group_ids[i]); gr = getgrgid(group_ids[i]);
if (gr == NULL) { if (gr == NULL) {
fprintf(stderr, "Failed to get group name\n"); fprintf(stderr, "Failed to get group name\n");
free(group_ids); free(group_ids);
for (j=0; j<i; j++) { free_groupnames(groupnames);
free(groupnames[j]);
}
free(groupnames);
return NULL; return NULL;
} }
...@@ -141,29 +162,16 @@ static char **get_groupnames(void) ...@@ -141,29 +162,16 @@ static char **get_groupnames(void)
if (groupnames[i] == NULL) { if (groupnames[i] == NULL) {
fprintf(stderr, "Failed to copy group name: %s", gr->gr_name); fprintf(stderr, "Failed to copy group name: %s", gr->gr_name);
free(group_ids); free(group_ids);
for (j=0; j<i; j++) { free_groupnames(groupnames);
free(groupnames[j]);
}
free(groupnames);
return NULL; return NULL;
} }
} }
groupnames[ngroups] = NULL;
free(group_ids); free(group_ids);
return groupnames; return groupnames;
} }
static void free_groupnames(char **groupnames)
{
char **group;
for (group=groupnames; group != NULL; group++)
free(*group);
free(groupnames);
}
static bool name_is_in_groupnames(char *name, char **groupnames) static bool name_is_in_groupnames(char *name, char **groupnames)
{ {
while (groupnames != NULL) { while (groupnames != NULL) {
...@@ -197,6 +205,12 @@ static struct alloted_s *append_alloted(struct alloted_s **head, char *name, int ...@@ -197,6 +205,12 @@ static struct alloted_s *append_alloted(struct alloted_s **head, char *name, int
} }
al->name = strdup(name); al->name = strdup(name);
if (al->name == NULL) {
free(al);
return NULL;
}
al->allowed = n; al->allowed = n;
al->next = NULL; al->next = NULL;
...@@ -283,12 +297,13 @@ static int get_alloted(char *me, char *intype, char *link, struct alloted_s **al ...@@ -283,12 +297,13 @@ static int get_alloted(char *me, char *intype, char *link, struct alloted_s **al
*/ */
append_alloted(alloted, name, n); append_alloted(alloted, name, n);
count += n; count += n;
break;
} }
free_groupnames(groups); free_groupnames(groups);
fclose(fin); fclose(fin);
free(line); free(line);
// now return the total number of nics that this user can create
return count; return count;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment