The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3362

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Closes #3361.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From c0408754ae4a981c4671f679e6c90a8c04280d9a Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 7 Apr 2020 21:28:17 +0200
Subject: [PATCH 1/2] lxc_user_nic: simplify group retrieval

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/cmd/lxc_user_nic.c | 47 ++++++++++----------------------------
 1 file changed, 12 insertions(+), 35 deletions(-)

diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c
index fd34559031..cb5d1d2be0 100644
--- a/src/lxc/cmd/lxc_user_nic.c
+++ b/src/lxc/cmd/lxc_user_nic.c
@@ -133,26 +133,14 @@ static char *get_username(void)
        return strdup(pwent.pw_name);
 }
 
-static void free_groupnames(char **groupnames)
-{
-       int i;
-
-       if (!groupnames)
-               return;
-
-       for (i = 0; groupnames[i]; i++)
-               free(groupnames[i]);
-
-       free(groupnames);
-}
 
 static char **get_groupnames(void)
 {
        __do_free char *buf = NULL;
        __do_free gid_t *group_ids = NULL;
+       __do_free_string_list char **groupnames = NULL;
        int ngroups;
        int ret, i;
-       char **groupnames;
        struct group grent;
        struct group *grentp = NULL;
        size_t bufsize;
@@ -161,10 +149,11 @@ static char **get_groupnames(void)
        if (ngroups < 0) {
                CMD_SYSERROR("Failed to get number of groups the user belongs 
to\n");
                return NULL;
-       } else if (ngroups == 0) {
-               return NULL;
        }
 
+       if (ngroups == 0)
+               return NULL;
+
        group_ids = malloc(sizeof(gid_t) * ngroups);
        if (!group_ids) {
                CMD_SYSERROR("Failed to allocate memory while getting groups 
the user belongs to\n");
@@ -177,44 +166,36 @@ static char **get_groupnames(void)
                return NULL;
        }
 
-       groupnames = malloc(sizeof(char *) * (ngroups + 1));
+       groupnames = zalloc(sizeof(char *) * (ngroups + 1));
        if (!groupnames) {
                CMD_SYSERROR("Failed to allocate memory while getting group 
names\n");
                return NULL;
        }
 
-       memset(groupnames, 0, sizeof(char *) * (ngroups + 1));
-
        bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
        if (bufsize == -1)
                bufsize = 1024;
 
        buf = malloc(bufsize);
        if (!buf) {
-               free_groupnames(groupnames);
                CMD_SYSERROR("Failed to allocate memory while getting group 
names\n");
                return NULL;
        }
 
        for (i = 0; i < ngroups; i++) {
                while ((ret = getgrgid_r(group_ids[i], &grent, buf, bufsize, 
&grentp)) == ERANGE) {
+                       char *new_buf;
+
                        bufsize <<= 1;
                        if (bufsize > MAX_GRBUF_SIZE) {
-                               usernic_error("Failed to get group members: 
%u\n",
-                                     group_ids[i]);
-                               free(buf);
-                               free(group_ids);
-                               free_groupnames(groupnames);
+                               usernic_error("Failed to get group members: 
%u\n", group_ids[i]);
                                return NULL;
                        }
-                       char *new_buf = realloc(buf, bufsize);
+
+                       new_buf = realloc(buf, bufsize);
                        if (!new_buf) {
-                               usernic_error("Failed to allocate memory while 
getting group "
-                                             "names: %s\n",
+                               usernic_error("Failed to allocate memory while 
getting group names: %s\n",
                                              strerror(errno));
-                               free(buf);
-                               free(group_ids);
-                               free_groupnames(groupnames);
                                return NULL;
                        }
                        buf = new_buf;
@@ -224,14 +205,12 @@ static char **get_groupnames(void)
                                usernic_error("%s", "Could not find matched 
group record\n");
 
                        CMD_SYSERROR("Failed to get group name: %u\n", 
group_ids[i]);
-                       free_groupnames(groupnames);
                        return NULL;
                }
 
                groupnames[i] = strdup(grent.gr_name);
                if (!groupnames[i]) {
                        usernic_error("Failed to copy group name \"%s\"", 
grent.gr_name);
-                       free_groupnames(groupnames);
                        return NULL;
                }
        }
@@ -325,9 +304,9 @@ static int get_alloted(char *me, char *intype, char *link,
 {
        __do_free char *line = NULL;
        __do_fclose FILE *fin = NULL;
+       __do_free_string_list char **groups = NULL;
        int n, ret;
        char name[100], type[100], br[100];
-       char **groups;
        int count = 0;
        size_t len = 0;
 
@@ -379,8 +358,6 @@ static int get_alloted(char *me, char *intype, char *link,
                count += n;
        }
 
-       free_groupnames(groups);
-
        /* Now return the total number of nics that this user can create. */
        return count;
 }

From 6b533a4acfd751bb850135a9bb05d27d64b70f93 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Tue, 7 Apr 2020 21:28:32 +0200
Subject: [PATCH 2/2] lxc_user_nic: continue when we failed to find a group

Closes #3361.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/cmd/lxc_user_nic.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c
index cb5d1d2be0..ad46af35c9 100644
--- a/src/lxc/cmd/lxc_user_nic.c
+++ b/src/lxc/cmd/lxc_user_nic.c
@@ -200,13 +200,10 @@ static char **get_groupnames(void)
                        }
                        buf = new_buf;
                }
-               if (!grentp) {
-                       if (ret == 0)
-                               usernic_error("%s", "Could not find matched 
group record\n");
 
-                       CMD_SYSERROR("Failed to get group name: %u\n", 
group_ids[i]);
-                       return NULL;
-               }
+               /* If a group is not found, just ignore it. */
+               if (!grentp)
+                       continue;
 
                groupnames[i] = strdup(grent.gr_name);
                if (!groupnames[i]) {
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to