about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/generic/glob.c32
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)