2003-01-15 Ulrich Drepper <drepper@redhat.com>
+ * nscd/nscd_getpw_r.c (nscd_getpw_r): Consolidate writing of the
+ request with one writev call. Protect all read calls with
+ TEMP_FAILURE_RETRY.
+ * nscd/nscd_getgr_r.c (nscd_getgr_r): Likewise.
+ * nscd/nscd_gethst_r.c (nscd_gethst_r): Likewise.
+
+ * nscd/hstcache.c: Use extend_alloca to reallocate alloca'd buffer.
+ Protect writev calls with TEMP_FAILURE_RETRY.
+ * nscd/grpcache.c: Likewise.
+ * nscd/pwdcache.c: Likewise.
+
* nscd/hstcache.c (addhstbynamev6): Don't interpret hostname as
IPv6 address in debug output.
/* Cache handling for group lookup.
- Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <alloca.h>
#include <errno.h>
#include <error.h>
#include <grp.h>
total = sizeof (notfound);
- written = writev (fd, &iov_notfound, 1);
+ written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len);
if (copy == NULL)
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
+#define INCR 1024
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[grpdb])
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[grpdb])
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <alloca.h>
#include <assert.h>
#include <errno.h>
#include <error.h>
total = sizeof (notfound);
- written = writev (fd, &iov_notfound, 1);
+ written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len);
if (copy == NULL)
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
+#define INCR 1024
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[hstdb])
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[hstdb])
bool use_malloc = false;
if (__builtin_expect (debug_level > 0, 0))
- dbg_log (_("Haven't found \"%s\" in hosts cache!"), key);
+ dbg_log (_("Haven't found \"%s\" in hosts cache!"), (char *) key);
if (secure[hstdb])
{
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[hstdb])
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[hstdb])
-/* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998.
vec[1].iov_base = (void *) key;
vec[1].iov_len = keylen;
- if ((size_t) __writev (sock, vec, 2) != sizeof (request_header) + keylen)
+ nbytes = (size_t) TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
+ if (nbytes != sizeof (request_header) + keylen)
{
__close (sock);
return -1;
}
- nbytes = __read (sock, &gr_resp, sizeof (gr_response_header));
+ nbytes = TEMP_FAILURE_RETRY (__read (sock, &gr_resp,
+ sizeof (gr_response_header)));
if (nbytes != sizeof (gr_response_header))
{
__close (sock);
total_len += gr_resp.gr_name_len + gr_resp.gr_passwd_len;
/* Get this data. */
- if ((size_t) __readv (sock, vec, 2) != total_len)
+ if ((size_t) TEMP_FAILURE_RETRY (__readv (sock, vec, 2)) != total_len)
{
__close (sock);
return -1;
if (total_len > buflen)
goto no_room;
- if (__read (sock, resultbuf->gr_mem[0], total_len) != total_len)
+ if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->gr_mem[0],
+ total_len)) != total_len)
{
__close (sock);
/* The `errno' to some value != ERANGE. */
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1998-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
hst_response_header hst_resp;
request_header req;
ssize_t nbytes;
+ struct iovec vec[4];
if (sock == -1)
{
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
- nbytes = __write (sock, &req, sizeof (request_header));
- if (nbytes != sizeof (request_header))
- {
- __close (sock);
- return -1;
- }
- nbytes = __write (sock, key, req.key_len);
- if (nbytes != req.key_len)
+ vec[0].iov_base = &req;
+ vec[0].iov_len = sizeof (request_header);
+ vec[1].iov_base = (void *) key;
+ vec[1].iov_len = req.key_len;
+
+ nbytes = TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
+ if ((size_t) nbytes != sizeof (request_header) + req.key_len)
{
__close (sock);
return -1;
}
- nbytes = __read (sock, &hst_resp, sizeof (hst_response_header));
+ nbytes = TEMP_FAILURE_RETRY (__read (sock, &hst_resp,
+ sizeof (hst_response_header)));
if (nbytes != sizeof (hst_response_header))
{
__close (sock);
if (hst_resp.found == 1)
{
- struct iovec vec[4];
uint32_t *aliases_len;
char *cp = buffer;
uintptr_t align1;
}
resultbuf->h_addr_list[cnt] = NULL;
- if ((size_t) __readv (sock, vec, n) != total_len)
+ if ((size_t) TEMP_FAILURE_RETRY (__readv (sock, vec, n)) != total_len)
{
__close (sock);
return -1;
goto no_room;
/* And finally read the aliases. */
- if ((size_t) __read (sock, resultbuf->h_aliases[0], total_len)
- != total_len)
+ if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->h_aliases[0],
+ total_len)) != total_len)
{
__close (sock);
return -1;
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998.
request_header req;
pw_response_header pw_resp;
ssize_t nbytes;
+ struct iovec vec[2];
if (sock == -1)
{
req.version = NSCD_VERSION;
req.type = type;
req.key_len = keylen;
- nbytes = __write (sock, &req, sizeof (request_header));
- if (nbytes != sizeof (request_header))
- {
- __close (sock);
- return -1;
- }
- nbytes = __write (sock, key, keylen);
- if (nbytes != keylen)
+ vec[0].iov_base = &req;
+ vec[0].iov_len = sizeof (request_header);
+ vec[1].iov_base = (void *) key;
+ vec[1].iov_len = keylen;
+
+ nbytes = (size_t) TEMP_FAILURE_RETRY (__writev (sock, vec, 2));
+ if (nbytes != sizeof (request_header) + keylen)
{
__close (sock);
return -1;
}
- nbytes = __read (sock, &pw_resp, sizeof (pw_response_header));
+ nbytes = TEMP_FAILURE_RETRY (__read (sock, &pw_resp,
+ sizeof (pw_response_header)));
if (nbytes != sizeof (pw_response_header))
{
__close (sock);
/* get pw_pshell */
resultbuf->pw_shell = p;
- nbytes = __read (sock, buffer, total);
+ nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
__close (sock);
/* Cache handling for passwd lookup.
- Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <alloca.h>
#include <errno.h>
#include <error.h>
#include <pwd.h>
total = sizeof (notfound);
- written = writev (fd, &iov_notfound, 1);
+ written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len);
if (copy == NULL)
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
+#define INCR 1024
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[pwddb])
{
char *old_buffer = buffer;
errno = 0;
- buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
+ buflen += 1024;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
use_malloc = true;
}
else
- {
- buffer = (char *) alloca (buflen);
-#if _STACK_GROWS_DOWN
- if (buffer + buflen == old_buffer)
- buflen = 2 * buflen - 1024;
-#elif _STACK_GROWS_UP
- if (old_buffer + buflen - 1024 == buffer)
- {
- buffer = old_buffer;
- buflen = 2 * buflen - 1024;
- }
-#endif
- }
+ /* Allocate a new buffer on the stack. If possible combine it
+ with the previously allocated buffer. */
+ buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
}
if (secure[pwddb])