mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 03:10:05 +00:00
Update.
* 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:
parent
c9f24336e0
commit
9caf4f1c67
11
ChangeLog
11
ChangeLog
@ -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.
|
||||||
|
|
||||||
|
@ -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])
|
||||||
|
@ -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])
|
||||||
|
@ -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. */
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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])
|
||||||
|
Loading…
Reference in New Issue
Block a user