diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c index 84823bd5d..40c9aa9d7 100644 --- a/src/lxc/cmd/lxc_user_nic.c +++ b/src/lxc/cmd/lxc_user_nic.c @@ -206,7 +206,28 @@ static char **get_groupnames(void) } for (i = 0; i < ngroups; i++) { - ret = getgrgid_r(group_ids[i], &grent, buf, bufsize, &grentp); + while ((ret = getgrgid_r(group_ids[i], &grent, buf, bufsize, &grentp)) == ERANGE) { + 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); + return NULL; + } + char *new_buf = realloc(buf, bufsize); + if (!new_buf) { + 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; + } if (!grentp) { if (ret == 0) usernic_error("%s", "Could not find matched group record\n"); diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 747e14b6e..9f1c21ddd 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -26,6 +26,10 @@ /* Properly support loop devices on 32bit systems. */ #define _FILE_OFFSET_BITS 64 +#ifndef MAX_GRBUF_SIZE +#define MAX_GRBUF_SIZE 65536 +#endif + #include #include #include