mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-11 11:50:06 +00:00
getent: Use dynarray in initgroups_keys [BZ #18023]
This commit is contained in:
parent
a26fe1638b
commit
1599ed4e95
@ -1,3 +1,9 @@
|
||||
2018-06-25 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #18023]
|
||||
* nss/getent.c (initgroups_keys): Use dynarray instead of
|
||||
extend_alloca.
|
||||
|
||||
2018-06-25 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #18023]
|
||||
|
40
nss/getent.c
40
nss/getent.c
@ -39,6 +39,7 @@
|
||||
#include <netinet/ether.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#include <scratch_buffer.h>
|
||||
|
||||
/* Get libc version number. */
|
||||
#include <version.h>
|
||||
@ -473,34 +474,51 @@ netgroup_keys (int number, char *key[])
|
||||
return result;
|
||||
}
|
||||
|
||||
#define DYNARRAY_STRUCT gid_list
|
||||
#define DYNARRAY_ELEMENT gid_t
|
||||
#define DYNARRAY_PREFIX gid_list_
|
||||
#define DYNARRAY_INITIAL_SIZE 10
|
||||
#include <malloc/dynarray-skeleton.c>
|
||||
|
||||
/* This is for initgroups */
|
||||
static int
|
||||
initgroups_keys (int number, char *key[])
|
||||
{
|
||||
int ngrps = 100;
|
||||
size_t grpslen = ngrps * sizeof (gid_t);
|
||||
gid_t *grps = alloca (grpslen);
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
fprintf (stderr, _("Enumeration not supported on %s\n"), "initgroups");
|
||||
return 3;
|
||||
}
|
||||
|
||||
struct gid_list list;
|
||||
gid_list_init (&list);
|
||||
if (!gid_list_resize (&list, 10))
|
||||
{
|
||||
fprintf (stderr, _("Could not allocate group list: %m\n"));
|
||||
return 3;
|
||||
}
|
||||
|
||||
for (int i = 0; i < number; ++i)
|
||||
{
|
||||
int no = ngrps;
|
||||
int no = gid_list_size (&list);
|
||||
int n;
|
||||
while ((n = getgrouplist (key[i], -1, grps, &no)) == -1
|
||||
&& no > ngrps)
|
||||
while ((n = getgrouplist (key[i], -1, gid_list_begin (&list), &no)) == -1
|
||||
&& no > gid_list_size (&list))
|
||||
{
|
||||
grps = extend_alloca (grps, grpslen, no * sizeof (gid_t));
|
||||
ngrps = no;
|
||||
if (!gid_list_resize (&list, no))
|
||||
{
|
||||
fprintf (stderr, _("Could not allocate group list: %m\n"));
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
if (n == -1)
|
||||
return 1;
|
||||
{
|
||||
gid_list_free (&list);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const gid_t *grps = gid_list_begin (&list);
|
||||
printf ("%-21s", key[i]);
|
||||
for (int j = 0; j < n; ++j)
|
||||
if (grps[j] != -1)
|
||||
@ -508,6 +526,8 @@ initgroups_keys (int number, char *key[])
|
||||
putchar_unlocked ('\n');
|
||||
}
|
||||
|
||||
gid_list_free (&list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user