mirror of git://sourceware.org/git/glibc.git
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>
|
2018-06-25 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
[BZ #18023]
|
[BZ #18023]
|
||||||
|
|
38
nss/getent.c
38
nss/getent.c
|
@ -39,6 +39,7 @@
|
||||||
#include <netinet/ether.h>
|
#include <netinet/ether.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <scratch_buffer.h>
|
||||||
|
|
||||||
/* Get libc version number. */
|
/* Get libc version number. */
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
|
@ -473,34 +474,51 @@ netgroup_keys (int number, char *key[])
|
||||||
return result;
|
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 */
|
/* This is for initgroups */
|
||||||
static int
|
static int
|
||||||
initgroups_keys (int number, char *key[])
|
initgroups_keys (int number, char *key[])
|
||||||
{
|
{
|
||||||
int ngrps = 100;
|
|
||||||
size_t grpslen = ngrps * sizeof (gid_t);
|
|
||||||
gid_t *grps = alloca (grpslen);
|
|
||||||
|
|
||||||
if (number == 0)
|
if (number == 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, _("Enumeration not supported on %s\n"), "initgroups");
|
fprintf (stderr, _("Enumeration not supported on %s\n"), "initgroups");
|
||||||
return 3;
|
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)
|
for (int i = 0; i < number; ++i)
|
||||||
{
|
{
|
||||||
int no = ngrps;
|
int no = gid_list_size (&list);
|
||||||
int n;
|
int n;
|
||||||
while ((n = getgrouplist (key[i], -1, grps, &no)) == -1
|
while ((n = getgrouplist (key[i], -1, gid_list_begin (&list), &no)) == -1
|
||||||
&& no > ngrps)
|
&& no > gid_list_size (&list))
|
||||||
{
|
{
|
||||||
grps = extend_alloca (grps, grpslen, no * sizeof (gid_t));
|
if (!gid_list_resize (&list, no))
|
||||||
ngrps = no;
|
{
|
||||||
|
fprintf (stderr, _("Could not allocate group list: %m\n"));
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
|
{
|
||||||
|
gid_list_free (&list);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const gid_t *grps = gid_list_begin (&list);
|
||||||
printf ("%-21s", key[i]);
|
printf ("%-21s", key[i]);
|
||||||
for (int j = 0; j < n; ++j)
|
for (int j = 0; j < n; ++j)
|
||||||
if (grps[j] != -1)
|
if (grps[j] != -1)
|
||||||
|
@ -508,6 +526,8 @@ initgroups_keys (int number, char *key[])
|
||||||
putchar_unlocked ('\n');
|
putchar_unlocked ('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gid_list_free (&list);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue