1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
* 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> 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 * grp/initgroups.c (initgroups): Don't limit the possible number
of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around of groups to NGROUPS_MAX. Allow dynamic resizing. Loop around
the setgroups call while the call fails and descrease the number 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 in doing a port, please contact the glibc maintainers by sending
electronic mail to <bug-glibc@gnu.org>. electronic mail to <bug-glibc@gnu.org>.
The GNU C library now includes Michael Glad's Ultra Fast Crypt, which There are some add-ons which can be used together with GNU libc. They
provides the Unix `crypt' function, plus some other entry points. are designed in a way to ease the installation by integrating them in
Because of the United States export restriction on DES the libc source tree. Simply get the add-ons you need and use the
implementations, we are distributing this code separately from the --enable-add-ons option of the `configure' script to tell where the
rest of the C library. There is an extra distribution tar file just add-ons are found. Please read the FAQ file for more details.
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.
See the file INSTALL to find out how to configure, build, install, and port 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 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 /* 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. This file is part of the GNU C Library.
Written by Miles Bader <miles@gnu.ai.mit.edu>. Written by Miles Bader <miles@gnu.ai.mit.edu>.
@ -615,9 +615,9 @@ parser_finalize (struct parser *parser,
group++) group++)
if (group->args_processed == 0) if (group->args_processed == 0)
err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0); err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
for (group = parser->groups; for (group = parser->egroup - 1;
group < parser->egroup && (!err || err==EBADKEY); group >= parser->groups && (!err || err==EBADKEY);
group++) group--)
err = group_parse (group, &parser->state, ARGP_KEY_END, 0); err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
if (err == EBADKEY) if (err == EBADKEY)

View File

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

View File

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

View File

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

View File

@ -495,7 +495,9 @@ case ARGP_KEY_ARGS:
@comment argp.h @comment argp.h
@comment GNU @comment GNU
@item ARGP_KEY_END @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 argp.h
@comment GNU @comment GNU

View File

@ -27,6 +27,7 @@
#include <rpcsvc/yp.h> #include <rpcsvc/yp.h>
#include <rpcsvc/ypclnt.h> #include <rpcsvc/ypclnt.h>
#include <rpcsvc/nis.h> #include <rpcsvc/nis.h>
#include <sys/param.h>
#include <nsswitch.h> #include <nsswitch.h>
#include "nss-nis.h" #include "nss-nis.h"
@ -589,7 +590,8 @@ internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
enum nss_status enum nss_status
_nss_compat_initgroups_dyn (const char *user, gid_t group, long int *start, _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; struct group grpbuf, *g;
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); 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. */ /* Need a bigger buffer. */
gid_t *newgroups; 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) if (newgroups == NULL)
goto done; goto done;
*groupsp = groups = newgroups; *groupsp = groups = newgroups;
*size *= 2; *size = newsize;
} }
groups[*start] = g->gr_gid; groups[*start] = g->gr_gid;

View File

@ -25,6 +25,7 @@
#include <unistd.h> #include <unistd.h>
#include <rpcsvc/yp.h> #include <rpcsvc/yp.h>
#include <rpcsvc/ypclnt.h> #include <rpcsvc/ypclnt.h>
#include <sys/param.h>
#include "nss-nis.h" #include "nss-nis.h"
@ -138,7 +139,8 @@ internal_getgrent_r (struct group *grp, char *buffer, size_t buflen,
enum nss_status enum nss_status
_nss_nis_initgroups_dyn (const char *user, gid_t group, long int *start, _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; struct group grpbuf, *g;
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); 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. */ /* Need a bigger buffer. */
gid_t *newgroups; 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) if (newgroups == NULL)
goto done; goto done;
*groupsp = groups = newgroups; *groupsp = groups = newgroups;
*size *= 2; *size = newsize;
} }
groups[*start] = g->gr_gid; groups[*start] = g->gr_gid;

View File

@ -21,11 +21,13 @@
#include <features.h> #include <features.h>
/* Definitions for byte order, according to significance of bytes, from low /* Definitions for byte order, according to significance of bytes,
addresses to high addresses. The value is what you get by putting '4' from low addresses to high addresses. The value is what you get by
in the most significant byte, '3' in the second most significant byte, putting '4' in the most significant byte, '3' in the second most
'2' in the second least significant byte, and '1' in the least significant byte, '2' in the second least significant byte, and '1'
significant byte. */ 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 __LITTLE_ENDIAN 1234
#define __BIG_ENDIAN 4321 #define __BIG_ENDIAN 4321