* 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.
This commit is contained in:
Ulrich Drepper 2003-01-15 10:52:50 +00:00
parent c9f24336e0
commit 9caf4f1c67
7 changed files with 91 additions and 150 deletions

View File

@ -1,5 +1,16 @@
2003-01-15 Ulrich Drepper <drepper@redhat.com> 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 * nscd/hstcache.c (addhstbynamev6): Don't interpret hostname as
IPv6 address in debug output. IPv6 address in debug output.

View File

@ -1,5 +1,5 @@
/* Cache handling for group lookup. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -18,6 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <alloca.h>
#include <errno.h> #include <errno.h>
#include <error.h> #include <error.h>
#include <grp.h> #include <grp.h>
@ -95,7 +96,7 @@ cache_addgr (struct database *db, int fd, request_header *req, void *key,
total = sizeof (notfound); total = sizeof (notfound);
written = writev (fd, &iov_notfound, 1); written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len); copy = malloc (req->key_len);
if (copy == NULL) if (copy == NULL)
@ -227,10 +228,11 @@ addgrbyname (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024; #define INCR 1024
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -244,19 +246,9 @@ addgrbyname (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[grpdb]) if (secure[grpdb])
@ -309,10 +301,10 @@ addgrbygid (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -326,19 +318,9 @@ addgrbygid (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[grpdb]) if (secure[grpdb])

View File

@ -18,6 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <alloca.h>
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <error.h> #include <error.h>
@ -103,7 +104,7 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
total = sizeof (notfound); total = sizeof (notfound);
written = writev (fd, &iov_notfound, 1); written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len); copy = malloc (req->key_len);
if (copy == NULL) if (copy == NULL)
@ -315,10 +316,11 @@ addhstbyname (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024; #define INCR 1024
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -332,19 +334,9 @@ addhstbyname (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[hstdb]) if (secure[hstdb])
@ -392,10 +384,10 @@ addhstbyaddr (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -409,19 +401,9 @@ addhstbyaddr (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[hstdb]) if (secure[hstdb])
@ -450,7 +432,7 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
bool use_malloc = false; bool use_malloc = false;
if (__builtin_expect (debug_level > 0, 0)) 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]) if (secure[hstdb])
{ {
@ -465,10 +447,10 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -482,19 +464,9 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[hstdb]) if (secure[hstdb])
@ -542,10 +514,10 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -559,19 +531,9 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[hstdb]) if (secure[hstdb])

View File

@ -1,4 +1,4 @@
/* 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. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998. Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998.
@ -114,13 +114,15 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
vec[1].iov_base = (void *) key; vec[1].iov_base = (void *) key;
vec[1].iov_len = keylen; 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); __close (sock);
return -1; 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)) if (nbytes != sizeof (gr_response_header))
{ {
__close (sock); __close (sock);
@ -182,7 +184,7 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
total_len += gr_resp.gr_name_len + gr_resp.gr_passwd_len; total_len += gr_resp.gr_name_len + gr_resp.gr_passwd_len;
/* Get this data. */ /* 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); __close (sock);
return -1; return -1;
@ -203,7 +205,8 @@ nscd_getgr_r (const char *key, size_t keylen, request_type type,
if (total_len > buflen) if (total_len > buflen)
goto no_room; 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); __close (sock);
/* The `errno' to some value != ERANGE. */ /* The `errno' to some value != ERANGE. */

View File

@ -1,4 +1,4 @@
/* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -123,6 +123,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
hst_response_header hst_resp; hst_response_header hst_resp;
request_header req; request_header req;
ssize_t nbytes; ssize_t nbytes;
struct iovec vec[4];
if (sock == -1) if (sock == -1)
{ {
@ -133,21 +134,21 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
req.version = NSCD_VERSION; req.version = NSCD_VERSION;
req.type = type; req.type = type;
req.key_len = keylen; req.key_len = keylen;
nbytes = __write (sock, &req, sizeof (request_header));
if (nbytes != sizeof (request_header)) 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); __close (sock);
return -1; return -1;
} }
nbytes = __write (sock, key, req.key_len); nbytes = TEMP_FAILURE_RETRY (__read (sock, &hst_resp,
if (nbytes != req.key_len) sizeof (hst_response_header)));
{
__close (sock);
return -1;
}
nbytes = __read (sock, &hst_resp, sizeof (hst_response_header));
if (nbytes != sizeof (hst_response_header)) if (nbytes != sizeof (hst_response_header))
{ {
__close (sock); __close (sock);
@ -164,7 +165,6 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
if (hst_resp.found == 1) if (hst_resp.found == 1)
{ {
struct iovec vec[4];
uint32_t *aliases_len; uint32_t *aliases_len;
char *cp = buffer; char *cp = buffer;
uintptr_t align1; uintptr_t align1;
@ -263,7 +263,7 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
} }
resultbuf->h_addr_list[cnt] = NULL; 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); __close (sock);
return -1; return -1;
@ -284,8 +284,8 @@ nscd_gethst_r (const char *key, size_t keylen, request_type type,
goto no_room; goto no_room;
/* And finally read the aliases. */ /* And finally read the aliases. */
if ((size_t) __read (sock, resultbuf->h_aliases[0], total_len) if ((size_t) TEMP_FAILURE_RETRY (__read (sock, resultbuf->h_aliases[0],
!= total_len) total_len)) != total_len)
{ {
__close (sock); __close (sock);
return -1; return -1;

View File

@ -1,4 +1,4 @@
/* 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. This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998. Contributed by Thorsten Kukuk <kukuk@uni-paderborn.de>, 1998.
@ -96,6 +96,7 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
request_header req; request_header req;
pw_response_header pw_resp; pw_response_header pw_resp;
ssize_t nbytes; ssize_t nbytes;
struct iovec vec[2];
if (sock == -1) if (sock == -1)
{ {
@ -106,21 +107,21 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
req.version = NSCD_VERSION; req.version = NSCD_VERSION;
req.type = type; req.type = type;
req.key_len = keylen; req.key_len = keylen;
nbytes = __write (sock, &req, sizeof (request_header));
if (nbytes != sizeof (request_header)) 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); __close (sock);
return -1; return -1;
} }
nbytes = __write (sock, key, keylen); nbytes = TEMP_FAILURE_RETRY (__read (sock, &pw_resp,
if (nbytes != keylen) sizeof (pw_response_header)));
{
__close (sock);
return -1;
}
nbytes = __read (sock, &pw_resp, sizeof (pw_response_header));
if (nbytes != sizeof (pw_response_header)) if (nbytes != sizeof (pw_response_header))
{ {
__close (sock); __close (sock);
@ -168,7 +169,7 @@ nscd_getpw_r (const char *key, size_t keylen, request_type type,
/* get pw_pshell */ /* get pw_pshell */
resultbuf->pw_shell = p; resultbuf->pw_shell = p;
nbytes = __read (sock, buffer, total); nbytes = TEMP_FAILURE_RETRY (__read (sock, buffer, total));
__close (sock); __close (sock);

View File

@ -1,5 +1,5 @@
/* Cache handling for passwd lookup. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -18,6 +18,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <alloca.h>
#include <errno.h> #include <errno.h>
#include <error.h> #include <error.h>
#include <pwd.h> #include <pwd.h>
@ -101,7 +102,7 @@ cache_addpw (struct database *db, int fd, request_header *req, void *key,
total = sizeof (notfound); total = sizeof (notfound);
written = writev (fd, &iov_notfound, 1); written = TEMP_FAILURE_RETRY (writev (fd, &iov_notfound, 1));
copy = malloc (req->key_len); copy = malloc (req->key_len);
if (copy == NULL) if (copy == NULL)
@ -223,10 +224,11 @@ addpwbyname (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024; #define INCR 1024
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += INCR;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -240,19 +242,9 @@ addpwbyname (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[pwddb]) if (secure[pwddb])
@ -305,10 +297,10 @@ addpwbyuid (struct database *db, int fd, request_header *req,
{ {
char *old_buffer = buffer; char *old_buffer = buffer;
errno = 0; errno = 0;
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0)) if (__builtin_expect (buflen > 32768, 0))
{ {
buflen += 1024;
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen); buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL) if (buffer == NULL)
{ {
@ -322,19 +314,9 @@ addpwbyuid (struct database *db, int fd, request_header *req,
use_malloc = true; use_malloc = true;
} }
else else
{ /* Allocate a new buffer on the stack. If possible combine it
buffer = (char *) alloca (buflen); with the previously allocated buffer. */
#if _STACK_GROWS_DOWN buffer = (char *) extend_alloca (buffer, buflen, buflen + INCR);
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
}
} }
if (secure[pwddb]) if (secure[pwddb])