aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--README27
-rw-r--r--argp/argp-parse.c8
-rw-r--r--grp/initgroups.c23
-rw-r--r--hesiod/nss_hesiod/hesiod-grp.c34
-rw-r--r--io/ftwtest-sh6
-rw-r--r--manual/argp.texi4
-rw-r--r--nis/nss_compat/compat-initgroups.c19
-rw-r--r--nis/nss_nis/nis-initgroups.c19
-rw-r--r--string/endian.h12
10 files changed, 110 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 46fc4bd..71867fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/README b/README
index 9967469..ec6464a 100644
--- a/README
+++ b/README
@@ -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
diff --git a/argp/argp-parse.c b/argp/argp-parse.c
index 758129a..0ff8a5b 100644
--- a/argp/argp-parse.c
+++ b/argp/argp-parse.c
@@ -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)
diff --git a/grp/initgroups.c b/grp/initgroups.c
index 950ebfe..a74a703 100644
--- a/grp/initgroups.c
+++ b/grp/initgroups.c
@@ -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)
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
index a89ed4e..5551d7d 100644
--- a/hesiod/nss_hesiod/hesiod-grp.c
+++ b/hesiod/nss_hesiod/hesiod-grp.c
@@ -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;
diff --git a/io/ftwtest-sh b/io/ftwtest-sh
index 389c412..837470d 100644
--- a/io/ftwtest-sh
+++ b/io/ftwtest-sh
@@ -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
diff --git a/manual/argp.texi b/manual/argp.texi
index 0a5d56d..8410856 100644
--- a/manual/argp.texi
+++ b/manual/argp.texi
@@ -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
diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c
index 4d14615..558433e 100644
--- a/nis/nss_compat/compat-initgroups.c
+++ b/nis/nss_compat/compat-initgroups.c
@@ -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;
diff --git a/nis/nss_nis/nis-initgroups.c b/nis/nss_nis/nis-initgroups.c
index ec13dbd..cf666a4 100644
--- a/nis/nss_nis/nis-initgroups.c
+++ b/nis/nss_nis/nis-initgroups.c
@@ -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;
diff --git a/string/endian.h b/string/endian.h
index 858ee6e..dcd5a4e 100644
--- a/string/endian.h
+++ b/string/endian.h
@@ -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