diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/generic/glob.c | 32 |
2 files changed, 29 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 0d8cdb9a4f..2f0205c6fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +1999-02-21 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/generic/glob.c (glob): Enlarge buffers for reentrant + lookup functions if it is too small. + 1999-02-20 Ulrich Drepper <drepper@cygnus.com> * elf/dl-deps.c (_dl_map_object_deps): Don't add dummy objects created diff --git a/sysdeps/generic/glob.c b/sysdeps/generic/glob.c index c30d8e41f1..977ce1509d 100644 --- a/sysdeps/generic/glob.c +++ b/sysdeps/generic/glob.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -649,8 +649,18 @@ glob (pattern, flags, errfunc, pglob) pwbuflen = 1024; pwtmpbuf = (char *) __alloca (pwbuflen); - success = (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) - >= 0); + success = 1; + while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) < 0) + { + if (errno != ERANGE) + { + success = 0; + break; + } + pwbuflen *= 2; + pwtmpbuf = (char *) __alloca (pwbuflen); + __set_errno (0); + } # else p = getpwnam (name); success = p != NULL; @@ -723,17 +733,23 @@ glob (pattern, flags, errfunc, pglob) buflen = 1024; pwtmpbuf = (char *) __alloca (buflen); - if (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0) - home_dir = p->pw_dir; - else - home_dir = NULL; + while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) < 0) + { + if (errno != ERANGE) + { + p = NULL; + break; + } + pwtmpbuf = __alloca (buflen *= 2); + __set_errno (0); + } # else p = getpwnam (user_name); +# endif if (p != NULL) home_dir = p->pw_dir; else home_dir = NULL; -# endif } /* If we found a home directory use this. */ if (home_dir != NULL) |