]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Correct handling of enlarging buffers (clear errno).
authorUlrich Drepper <drepper@redhat.com>
Fri, 30 Jan 1998 17:23:34 +0000 (17:23 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 30 Jan 1998 17:23:34 +0000 (17:23 +0000)
12 files changed:
grp/fgetgrent.c
grp/initgroups.c
inet/rcmd.c
inet/rexec.c
nss/getXXbyYY.c
nss/getXXent.c
pwd/fgetpwent.c
shadow/fgetspent.c
shadow/sgetspent.c
sunrpc/clnt_gen.c
sunrpc/clnt_simp.c
sunrpc/getrpcport.c

index 0b461ad5fea0752cdf3fba0a2ef4e1cf7590757d..03b9d046bacc979de6dd68349f055449af948de7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -33,7 +33,7 @@ fgetgrent (FILE *stream)
   static size_t buffer_size;
   static struct group resbuf;
   struct group *result;
-  int save;
+  int save, save_errno;
 
   /* Get lock.  */
   __libc_lock_lock (lock);
@@ -45,12 +45,16 @@ fgetgrent (FILE *stream)
       buffer = malloc (buffer_size);
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
+
   while (buffer != NULL
         && __fgetgrent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
         && errno == ERANGE)
     {
       char *new_buf;
       buffer_size += NSS_BUFLEN_GROUP;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -63,6 +67,9 @@ fgetgrent (FILE *stream)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index 2ca90ab18d1d269ab37d0cfca1dbd7ee61c3f37e..3cdc3ed484c83d5e87fb4d947a6428f700b40088 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1989, 1991, 1993, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1989, 91, 93, 96, 97, 98 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -47,6 +47,7 @@ initgroups (user, group)
   size_t ngroups;
   gid_t *groups;
   int status;
+  int save_errno;
 #ifdef NGROUPS_MAX
 # define limit NGROUPS_MAX
 
@@ -68,6 +69,7 @@ initgroups (user, group)
 
   n = 0;
   groups[n++] = group;
+  save_errno = errno;
 
   do
     {
@@ -76,6 +78,7 @@ initgroups (user, group)
        {
          buflen *= 2;
          tmpbuf = __alloca (buflen);
+         __set_errno (0);
        }
 
       if (status == 0 && g->gr_gid != group)
@@ -108,6 +111,7 @@ initgroups (user, group)
   while (status == 0);
 
 done:
+  __set_errno (save_errno);
   endgrent ();
 
   return setgroups (n, groups);
index 6a680c18b72bd239c71089a9b97876fcf74803b2..121cd19302f24245a15989d4ceab435b85c3cd7a 100644 (file)
@@ -74,11 +74,14 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
        int s, lport, timo;
        char c;
        int herr;
+       int save_errno;
 
        pid = getpid();
 
        hstbuflen = 1024;
        tmphstbuf = __alloca (hstbuflen);
+       save_errno = errno;
+
        while (__gethostbyname_r (*ahost, &hostbuf, tmphstbuf, hstbuflen,
                                  &hp, &herr) < 0)
          if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -92,8 +95,10 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
              /* Enlarge the buffer.  */
              hstbuflen *= 2;
              tmphstbuf = __alloca (hstbuflen);
+             __set_errno (0);
            }
 
+       __set_errno (save_errno);
        *ahost = hp->h_name;
        oldmask = sigblock(sigmask(SIGURG));
        for (timo = 1, lport = IPPORT_RESERVED - 1;;) {
@@ -264,9 +269,11 @@ ruserok(rhost, superuser, ruser, luser)
        u_int32_t addr;
        char **ap;
        int herr;
+       int save_errno;
 
        buflen = 1024;
        buffer = __alloca (buflen);
+       save_errno = errno;
 
        while (__gethostbyname_r (rhost, &hostbuf, buffer, buflen, &hp, &herr)
               < 0)
@@ -277,8 +284,11 @@ ruserok(rhost, superuser, ruser, luser)
              /* Enlarge the buffer.  */
              buflen *= 2;
              buffer = __alloca (buflen);
+             __set_errno (0);
            }
 
+       __set_errno (save_errno);
+
        for (ap = hp->h_addr_list; *ap; ++ap) {
                bcopy(*ap, &addr, sizeof(addr));
                if (iruserok(addr, superuser, ruser, luser) == 0)
@@ -436,6 +446,7 @@ __icheckhost(raddr, lhost)
        register u_int32_t laddr;
        register char **pp;
        int herr;
+       int save_errno;
 
        /* Try for raw ip address first. */
        if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1)
@@ -444,6 +455,8 @@ __icheckhost(raddr, lhost)
        /* Better be a hostname. */
        buflen = 1024;
        buffer = __alloca (buflen);
+       save_errno = errno;
+
        while (__gethostbyname_r (lhost, &hostbuf, buffer, buflen, &hp, &herr)
               < 0)
          if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -453,8 +466,11 @@ __icheckhost(raddr, lhost)
              /* Enlarge the buffer.  */
              buflen *= 2;
              buffer = __alloca (buflen);
+             __set_errno (0);
            }
 
+       __set_errno (save_errno);
+
        /* Spin through ip addresses. */
        for (pp = hp->h_addr_list; *pp; ++pp)
                if (!bcmp(&raddr, *pp, sizeof(u_int32_t)))
index 72df066b03eb9bf3f9d875da68f146b44b5dbe49..cd8343c8b97bded3cfdf545864d3c9a20a492821 100644 (file)
@@ -64,9 +64,12 @@ rexec(ahost, rport, name, pass, cmd, fd2p)
        int s, timo = 1, s3;
        char c;
        int herr;
+       int save_errno;
 
        hstbuflen = 1024;
        hsttmpbuf = __alloca (hstbuflen);
+       save_errno = errno;
+
        while (__gethostbyname_r (*ahost, &hostbuf, hsttmpbuf, hstbuflen,
                                  &hp, &herr) < 0)
          if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -80,8 +83,10 @@ rexec(ahost, rport, name, pass, cmd, fd2p)
              /* Enlarge the buffer.  */
              hstbuflen *= 2;
              hsttmpbuf = __alloca (hstbuflen);
+             __set_errno (0);
            }
 
+       __set_errno (save_errno);
        *ahost = hp->h_name;
        ruserpass(hp->h_name, &name, &pass);
 retry:
index f81df0538165862aea628e5ef0cb3acf331f4db6..077d0d70b71677f14c16ec72763b236a8bb39fbc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -79,7 +79,7 @@ FUNCTION_NAME (ADD_PARAMS)
   static size_t buffer_size;
   static LOOKUP_TYPE resbuf;
   LOOKUP_TYPE *result;
-  int save;
+  int save, save_errno;
 #ifdef NEED_H_ERRNO
   int h_errno_tmp = 0;
 #endif
@@ -100,6 +100,9 @@ FUNCTION_NAME (ADD_PARAMS)
 #endif
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
+
   while (buffer != NULL
         && INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, &resbuf, buffer,
                                       buffer_size, &result H_ERRNO_VAR) != 0
@@ -110,6 +113,7 @@ FUNCTION_NAME (ADD_PARAMS)
     {
       char *new_buf;
       buffer_size += BUFLEN;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -122,6 +126,9 @@ FUNCTION_NAME (ADD_PARAMS)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index eeb03dfa37c56347d3ebc69a59c094c3b2f655c0..d93f9fa04b1f75f8bcb08eea98e449e5fc619cb6 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -70,7 +70,7 @@ GETFUNC_NAME (void)
   static size_t buffer_size;
   static LOOKUP_TYPE resbuf;
   LOOKUP_TYPE *result;
-  int save;
+  int save, save_errno;
 
   /* Get lock.  */
   __libc_lock_lock (lock);
@@ -81,6 +81,9 @@ GETFUNC_NAME (void)
       buffer = malloc (buffer_size);
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
+
   while (buffer != NULL
         && INTERNAL (REENTRANT_GETNAME) (&resbuf, buffer, buffer_size, &result
                                          H_ERRNO_VAR) != 0
@@ -91,6 +94,7 @@ GETFUNC_NAME (void)
     {
       char *new_buf;
       buffer_size += BUFLEN;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -103,6 +107,9 @@ GETFUNC_NAME (void)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index 63f62fcf6d4e1926a414fc2d3df7670709fbe2d3..d076f347021804cd71dea8e73df4473cce737254 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -33,7 +33,7 @@ fgetpwent (FILE *stream)
   static size_t buffer_size;
   static struct passwd resbuf;
   struct passwd *result;
-  int save;
+  int save, save_errno;
 
   /* Get lock.  */
   __libc_lock_lock (lock);
@@ -45,12 +45,16 @@ fgetpwent (FILE *stream)
       buffer = malloc (buffer_size);
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
+
   while (buffer != NULL
         && __fgetpwent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
         && errno == ERANGE)
     {
       char *new_buf;
       buffer_size += NSS_BUFLEN_PASSWD;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -63,6 +67,9 @@ fgetpwent (FILE *stream)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index bd54c7e5959e464d3bffd0803a7994f1b688e7e2..b569744d62085780003951a5c5ee9283949fb310 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,7 +36,7 @@ fgetspent (FILE *stream)
   static size_t buffer_size;
   static struct spwd resbuf;
   struct spwd *result;
-  int save;
+  int save, save_errno;
 
   /* Get lock.  */
   __libc_lock_lock (lock);
@@ -48,12 +48,15 @@ fgetspent (FILE *stream)
       buffer = malloc (buffer_size);
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
   while (buffer != NULL
         && __fgetspent_r (stream, &resbuf, buffer, buffer_size, &result) != 0
         && errno == ERANGE)
     {
       char *new_buf;
       buffer_size += BUFLEN_SPWD;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -66,6 +69,9 @@ fgetspent (FILE *stream)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index ecfe01ed1d13ae832066fd8e38b305878af23fa6..95225614d09dc58074da5692f715ae972d2e7a3a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,7 +36,7 @@ sgetspent (const char *string)
   static size_t buffer_size;
   static struct spwd resbuf;
   struct spwd *result;
-  int save;
+  int save, save_errno;
 
   /* Get lock.  */
   __libc_lock_lock (lock);
@@ -48,12 +48,15 @@ sgetspent (const char *string)
       buffer = malloc (buffer_size);
     }
 
+  /* We don't want to pass errno == 0 or errno == ERANGE back */
+  save_errno = errno;
   while (buffer != NULL
         && __sgetspent_r (string, &resbuf, buffer, buffer_size, &result) != 0
         && errno == ERANGE)
     {
       char *new_buf;
       buffer_size += BUFLEN_SPWD;
+      __set_errno (0);
       new_buf = realloc (buffer, buffer_size);
       if (new_buf == NULL)
        {
@@ -66,6 +69,9 @@ sgetspent (const char *string)
       buffer = new_buf;
     }
 
+  if (errno == 0)
+    __set_errno (save_errno);
+
   if (buffer == NULL)
     result = NULL;
 
index d7b949caa69a936ca85f75bc9046a08089494946..45266c4dc84de9714e66f27703b72eba4c287367 100644 (file)
@@ -63,9 +63,11 @@ clnt_create(hostname, prog, vers, proto)
        struct timeval tv;
        CLIENT *client;
        int herr;
+       int save_errno;
 
        hstbuflen = 1024;
        hsttmpbuf = __alloca (hstbuflen);
+       save_errno = errno;
        while (__gethostbyname_r (hostname, &hostbuf, hsttmpbuf, hstbuflen,
                                  &h, &herr) < 0)
          if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -78,8 +80,12 @@ clnt_create(hostname, prog, vers, proto)
              /* Enlarge the buffer.  */
              hstbuflen *= 2;
              hsttmpbuf = __alloca (hstbuflen);
+             __set_errno (0);
            }
 
+       if (errno == 0)
+         __set_errno (save_errno);
+
        if (h->h_addrtype != AF_INET) {
                /*
                 * Only support INET for now
@@ -108,6 +114,7 @@ clnt_create(hostname, prog, vers, proto)
              /* Enlarge the buffer.  */
              prtbuflen *= 2;
              prttmpbuf = __alloca (prtbuflen);
+             __set_errno (0);
            }
 
        sock = RPC_ANYSOCK;
index 2c27388108d36c8133da9c35977d9d021e21e6f4..1ec8d0f12665358862b19afc8431a141b233584d 100644 (file)
@@ -63,6 +63,7 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
        enum clnt_stat clnt_stat;
        struct hostent hostbuf, *hp;
        struct timeval timeout, tottimeout;
+       int save_errno;
 
        if (crp == 0) {
                crp = (struct callrpc_private *)calloc(1, sizeof (*crp));
@@ -96,6 +97,8 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
 
                buflen = 1024;
                buffer = __alloca (buflen);
+               save_errno = errno;
+
                while (__gethostbyname_r (host, &hostbuf, buffer, buflen,
                                          &hp, &herr) < 0)
                  if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -105,8 +108,12 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
                      /* Enlarge the buffer.  */
                      buflen *= 2;
                      buffer = __alloca (buflen);
+                     __set_errno (0);
                    }
 
+               if (errno == 0)
+                 __set_errno (save_errno);
+
                timeout.tv_usec = 0;
                timeout.tv_sec = 5;
                bcopy(hp->h_addr, (char *)&server_addr.sin_addr, hp->h_length);
index 3e94dbbf7b64b078e8667341af8318ff77ae72a7..c405aef6bfb0852335bab0fea475dd8e76dbbe7a 100644 (file)
@@ -51,9 +51,12 @@ getrpcport(host, prognum, versnum, proto)
        size_t buflen;
        char *buffer;
        int herr;
+       int save_errno;
 
        buflen = 1024;
        buffer = __alloca (buflen);
+       save_errno = errno;
+
        while (__gethostbyname_r (host, &hostbuf, buffer, buflen, &hp, &herr)
               < 0)
          if (herr != NETDB_INTERNAL || errno != ERANGE)
@@ -63,8 +66,10 @@ getrpcport(host, prognum, versnum, proto)
              /* Enlarge the buffer.  */
              buflen *= 2;
              buffer = __alloca (buflen);
+             __set_errno (0);
            }
 
+       __set_errno (save_errno);
        bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length);
        addr.sin_family = AF_INET;
        addr.sin_port =  0;