* string/endian.h: Explain the _*_ENDIAN constant values a bit
	more.  Patch by scarlet@mit.edu [PR libc/1799].

	* io/ftwtest-sh: Add -f parameter to chmod if -R is also given.
	[PR libc/1792].

	* argp/argp-parse.c (parser_finalize): Reverse order in which
	parsers are run for ARGP_KEY_END.  [PR libc/1755].
This commit is contained in:
Ulrich Drepper 2000-07-24 05:41:25 +00:00
parent cf9e9ad98f
commit 7603ea28d3
10 changed files with 110 additions and 51 deletions

View File

@ -1,5 +1,14 @@
2000-07-23 Ulrich Drepper <drepper@redhat.com>
* string/endian.h: Explain the _*_ENDIAN constant values a bit
more. Patch by scarlet@mit.edu [PR libc/1799].
* io/ftwtest-sh: Add -f parameter to chmod if -R is also given.
[PR libc/1792].
* argp/argp-parse.c (parser_finalize): Reverse order in which
parsers are run for ARGP_KEY_END. [PR libc/1755].
* grp/initgroups.c (initgroups): Don't limit the possible number
of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around
the setgroups call while the call fails and descrease the number

27
README
View File

@ -48,28 +48,11 @@ work anymore. Porting the library is not hard. If you are interested
in doing a port, please contact the glibc maintainers by sending
electronic mail to <bug-glibc@gnu.org>.
The GNU C library now includes Michael Glad's Ultra Fast Crypt, which
provides the Unix `crypt' function, plus some other entry points.
Because of the United States export restriction on DES
implementations, we are distributing this code separately from the
rest of the C library. There is an extra distribution tar file just
for crypt; it is called `glibc-crypt-2.1.91.tar.gz'. You can just
unpack the crypt distribution along with the rest of the C library and
build; you can also build the library without getting crypt. Users
outside the USA can get the crypt distribution via anonymous FTP from
ftp.gwdg.de [134.76.11.100] in the directory pub/linux/glibc, or
another archive site outside the USA. Archive maintainers are
encouraged to copy this distribution to their archives outside the
USA. Please get it from ftp.gwdg.de; transferring this distribution
from ftp.gnu.org (or any other site in the USA) to a site outside the
USA is in violation of US export laws.
Beside the separate crypt tar file there are some more add-ons which can be
used together with GNU libc. They are designed in a way to ease the
installation by integrating them in the libc source tree. Simply get the
add-ons you need and use the --enable-add-ons option of the `configure'
script to tell where the add-ons are found. Please read the FAQ file for
more details.
There are some add-ons which can be used together with GNU libc. They
are designed in a way to ease the installation by integrating them in
the libc source tree. Simply get the add-ons you need and use the
--enable-add-ons option of the `configure' script to tell where the
add-ons are found. Please read the FAQ file for more details.
See the file INSTALL to find out how to configure, build, install, and port
the GNU C library. You might also consider reading the WWW pages for the

View File

@ -1,5 +1,5 @@
/* Hierarchial argument parsing, layered over getopt
Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Miles Bader <miles@gnu.ai.mit.edu>.
@ -615,9 +615,9 @@ parser_finalize (struct parser *parser,
group++)
if (group->args_processed == 0)
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
for (group = parser->groups;
group < parser->egroup && (!err || err==EBADKEY);
group++)
for (group = parser->egroup - 1;
group >= parser->groups && (!err || err==EBADKEY);
group--)
err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
if (err == EBADKEY)

View File

@ -49,7 +49,7 @@ extern service_user *__nss_group_database;
static enum nss_status
compat_call (service_user *nip, const char *user, gid_t group, long int *start,
long int *size, gid_t **groupsp, int *errnop)
long int *size, gid_t **groupsp, long int limit, int *errnop)
{
struct group grpbuf;
size_t buflen = __sysconf (_SC_GETGR_R_SIZE_MAX);
@ -102,11 +102,22 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
{
/* Need a bigger buffer. */
gid_t *newgroups;
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size *= 2;
*size = newsize;
}
groups[*start] = grpbuf.gr_gid;
@ -147,10 +158,12 @@ initgroups (user, group)
/* Start is one, because we have the first group as parameter. */
long int start = 1;
long int size;
long int limit;
gid_t *groups;
int result;
#ifdef NGROUPS_MAX
size = NGROUPS_MAX;
limit = -1;
#else
long int limit = __sysconf (_SC_NGROUPS_MAX);
@ -184,14 +197,14 @@ initgroups (user, group)
if (fct == NULL)
{
status = compat_call (nip, user, group, &start, &size, &groups,
&errno);
limit, &errno);
if (nss_next_action (nip, NSS_STATUS_UNAVAIL) != NSS_ACTION_CONTINUE)
break;
}
else
status = DL_CALL_FCT (fct, (user, group, &start, &size, &groups,
&errno));
limit, &errno));
/* This is really only for debugging. */
if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)

View File

@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include "nss_hesiod.h"
@ -165,7 +166,8 @@ internal_gid_from_group (void *context, const char *groupname, gid_t *group)
enum nss_status
_nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
long int *size, gid_t **groupsp, int *errnop)
long int *size, gid_t **groupsp, long int limit,
int *errnop)
{
enum nss_status status = NSS_STATUS_SUCCESS;
char **list = NULL;
@ -191,11 +193,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
{
/* Need a bigger buffer. */
gid_t *newgroups;
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size *= 2;
*size = newsize;
}
groups[(*start)++] = group;
@ -232,11 +245,22 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
{
/* Need a bigger buffer. */
gid_t *newgroups;
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size *= 2;
*size = newsize;
}
groups[(*start)++] = group;

View File

@ -28,10 +28,10 @@ tmpdir=$tmp/ftwtest.d
[ -f ${objpfx}elf/ld.so ] && ldso=${objpfx}elf/ld.so
trap 'chmod -R a+x $tmpdir; rm -fr $tmpdir $testout' 1 2 3 15
trap 'chmod -fR a+x $tmpdir; rm -fr $tmpdir $testout' 1 2 3 15
if test -d $tmpdir; then
chmod -R a+x $tmpdir
chmod -fR a+x $tmpdir
rm -fr $tmpdir
fi
mkdir $tmpdir
@ -112,7 +112,7 @@ EOF
rm $testout
# For the next test everything must be readable.
chmod -R a+x $tmpdir
chmod -fR a+x $tmpdir
LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir $tmpdir |
sort > $testout

View File

@ -495,7 +495,9 @@ case ARGP_KEY_ARGS:
@comment argp.h
@comment GNU
@item ARGP_KEY_END
There are no more command line arguments at all.
There are no more command line arguments at all. The parser functions
are called in different order (means children first) for this value
which allows each parser to clean up its state for the parent.
@comment argp.h
@comment GNU

View File

@ -27,6 +27,7 @@
#include <rpcsvc/yp.h>
#include <rpcsvc/ypclnt.h>
#include <rpcsvc/nis.h>
#include <sys/param.h>
#include <nsswitch.h>
#include "nss-nis.h"
@ -589,7 +590,8 @@ internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
enum nss_status
_nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start,
long int *size, gid_t **groupsp, int *errnop)
long int *size, gid_t **groupsp, long int limit,
int *errnop)
{
struct group grpbuf, *g;
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
@ -631,11 +633,22 @@ _nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start,
{
/* Need a bigger buffer. */
gid_t *newgroups;
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size *= 2;
*size = newsize;
}
groups[*start] = g->gr_gid;

View File

@ -25,6 +25,7 @@
#include <unistd.h>
#include <rpcsvc/yp.h>
#include <rpcsvc/ypclnt.h>
#include <sys/param.h>
#include "nss-nis.h"
@ -138,7 +139,8 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
enum nss_status
_nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
long int *size, gid_t **groupsp, int *errnop)
long int *size, gid_t **groupsp, long int limit,
int *errnop)
{
struct group grpbuf, *g;
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
@ -181,11 +183,22 @@ _nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start,
{
/* Need a bigger buffer. */
gid_t *newgroups;
newgroups = realloc (groups, 2 * *size * sizeof (*groups));
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size *= 2;
*size = newsize;
}
groups[*start] = g->gr_gid;

View File

@ -21,11 +21,13 @@
#include <features.h>
/* Definitions for byte order, according to significance of bytes, from low
addresses to high addresses. The value is what you get by putting '4'
in the most significant byte, '3' in the second most significant byte,
'2' in the second least significant byte, and '1' in the least
significant byte. */
/* Definitions for byte order, according to significance of bytes,
from low addresses to high addresses. The value is what you get by
putting '4' in the most significant byte, '3' in the second most
significant byte, '2' in the second least significant byte, and '1'
in the least significant byte, and then writing down one digit for
each byte, starting with the byte at the lowest address at the left,
and proceeding to the byte with the highest address at the right. */
#define __LITTLE_ENDIAN 1234
#define __BIG_ENDIAN 4321