2002-03-21  Ulrich Drepper  <drepper@redhat.com>

	* nscd/grpcache.c (addgrbyname): Improve buffer allocate with alloca.
	Use realloc if too large.
	(addgrbyid): Likewise.
	* nscd/hstcache.c (addhstbyname): Likewise.
	(addhstbyaddr): Likewise.
	(addhstbynamev6): Likewise.
	(addhstbyaddrv6): Likewise.
	* nscd/pwdcache.c (addpwbyname): Likewise.
	(addpwbyuid): Likewise.
This commit is contained in:
Ulrich Drepper 2002-03-22 07:17:03 +00:00
parent 0472723ab8
commit c7a9b6e2d3
4 changed files with 261 additions and 47 deletions

View File

@ -1,3 +1,15 @@
2002-03-21 Ulrich Drepper <drepper@redhat.com>
* nscd/grpcache.c (addgrbyname): Improve buffer allocate with alloca.
Use realloc if too large.
(addgrbyid): Likewise.
* nscd/hstcache.c (addhstbyname): Likewise.
(addhstbyaddr): Likewise.
(addhstbynamev6): Likewise.
(addhstbyaddrv6): Likewise.
* nscd/pwdcache.c (addpwbyname): Likewise.
(addpwbyuid): Likewise.
2002-03-21 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h (struct

View File

@ -207,14 +207,14 @@ addgrbyname (struct database *db, int fd, request_header *req,
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 1024;
char *buffer = alloca (buflen);
char *buffer = (char *) alloca (buflen);
struct group resultbuf;
struct group *grp;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
dbg_log (_("Haven't found \"%s\" in group cache!"), (char *)key);
if (__builtin_expect (debug_level > 0, 0))
dbg_log (_("Haven't found \"%s\" in group cache!"), (char *) key);
if (secure[grpdb])
{
@ -245,7 +245,7 @@ addgrbyname (struct database *db, int fd, request_header *req,
}
else
{
buffer = alloca (buflen);
buffer = (char *) alloca (buflen);
#if _STACK_GROWS_DOWN
if (buffer + buflen == old_buffer)
buflen = 2 * buflen - 1024;
@ -278,7 +278,7 @@ addgrbygid (struct database *db, int fd, request_header *req,
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 1024;
char *buffer = alloca (buflen);
char *buffer = (char *) alloca (buflen);
struct group resultbuf;
struct group *grp;
uid_t oldeuid = 0;
@ -286,16 +286,16 @@ addgrbygid (struct database *db, int fd, request_header *req,
gid_t gid = strtoul ((char *)key, &ep, 10);
bool use_malloc = false;
if (*(char*)key == '\0' || *ep != '\0') /* invalid numeric gid */
if (*(char *) key == '\0' || *ep != '\0') /* invalid numeric gid */
{
if (debug_level > 0)
dbg_log (_("Invalid numeric gid \"%s\"!"), (char *)key);
dbg_log (_("Invalid numeric gid \"%s\"!"), (char *) key);
errno = EINVAL;
return;
}
if (debug_level > 0)
if (__builtin_expect (debug_level > 0, 0))
dbg_log (_("Haven't found \"%d\" in group cache!"), gid);
if (secure[grpdb])
@ -327,7 +327,7 @@ addgrbygid (struct database *db, int fd, request_header *req,
}
else
{
buffer = alloca (buflen);
buffer = (char *) alloca (buflen);
#if _STACK_GROWS_DOWN
if (buffer + buflen == old_buffer)
buflen = 2 * buflen - 1024;

View File

@ -1,5 +1,5 @@
/* Cache handling for host lookup.
Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -22,6 +22,7 @@
#include <errno.h>
#include <error.h>
#include <netdb.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@ -31,6 +32,7 @@
#include <libintl.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stackinfo.h>
#include "nscd.h"
#include "dbg_log.h"
@ -289,14 +291,15 @@ addhstbyname (struct database *db, int fd, request_header *req,
look again in the table whether the dataset is now available. We
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 512;
char *buffer = alloca (buflen);
int buflen = 1024;
char *buffer = (char *) alloca (buflen);
struct hostent resultbuf;
struct hostent *hst;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
dbg_log (_("Haven't found \"%s\" in hosts cache!"), (char *)key);
if (__builtin_expect (debug_level > 0, 0))
dbg_log (_("Haven't found \"%s\" in hosts cache!"), (char *) key);
if (secure[hstdb])
{
@ -309,15 +312,47 @@ addhstbyname (struct database *db, int fd, request_header *req,
&& h_errno == NETDB_INTERNAL
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
hst = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[hstdb])
seteuid (oldeuid);
cache_addhst (db, fd, req, key, hst, uid);
if (use_malloc)
free (buffer);
}
@ -329,13 +364,14 @@ addhstbyaddr (struct database *db, int fd, request_header *req,
look again in the table whether the dataset is now available. We
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 512;
char *buffer = alloca (buflen);
int buflen = 1024;
char *buffer = (char *) alloca (buflen);
struct hostent resultbuf;
struct hostent *hst;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
if (__builtin_expect (debug_level > 0, 0))
{
char buf[INET_ADDRSTRLEN];
dbg_log (_("Haven't found \"%s\" in hosts cache!"),
@ -353,15 +389,47 @@ addhstbyaddr (struct database *db, int fd, request_header *req,
&& h_errno == NETDB_INTERNAL
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
hst = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[hstdb])
seteuid (oldeuid);
cache_addhst (db, fd, req, key, hst, uid);
if (use_malloc)
free (buffer);
}
@ -373,13 +441,14 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
look again in the table whether the dataset is now available. We
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 512;
char *buffer = alloca (buflen);
int buflen = 1024;
char *buffer = (char *) alloca (buflen);
struct hostent resultbuf;
struct hostent *hst;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
if (__builtin_expect (debug_level > 0, 0))
{
char buf[INET6_ADDRSTRLEN];
@ -398,15 +467,47 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
&& h_errno == NETDB_INTERNAL
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
hst = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[hstdb])
seteuid (oldeuid);
cache_addhst (db, fd, req, key, hst, uid);
if (use_malloc)
free (buffer);
}
@ -418,13 +519,14 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req,
look again in the table whether the dataset is now available. We
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 512;
char *buffer = alloca (buflen);
int buflen = 1024;
char *buffer = (char *) alloca (buflen);
struct hostent resultbuf;
struct hostent *hst;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
if (__builtin_expect (debug_level > 0, 0))
{
char buf[INET6_ADDRSTRLEN];
dbg_log (_("Haven't found \"%s\" in hosts cache!"),
@ -442,13 +544,45 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req,
&& h_errno == NETDB_INTERNAL
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
hst = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[hstdb])
seteuid (oldeuid);
cache_addhst (db, fd, req, key, hst, uid);
if (use_malloc)
free (buffer);
}

View File

@ -1,5 +1,5 @@
/* Cache handling for passwd lookup.
Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -21,6 +21,7 @@
#include <errno.h>
#include <error.h>
#include <pwd.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@ -28,6 +29,7 @@
#include <time.h>
#include <unistd.h>
#include <libintl.h>
#include <stackinfo.h>
#include "nscd.h"
#include "dbg_log.h"
@ -200,14 +202,15 @@ addpwbyname (struct database *db, int fd, request_header *req,
look again in the table whether the dataset is now available. We
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 256;
char *buffer = alloca (buflen);
int buflen = 1024;
char *buffer = (char *) alloca (buflen);
struct passwd resultbuf;
struct passwd *pwd;
uid_t oldeuid = 0;
bool use_malloc = false;
if (debug_level > 0)
dbg_log (_("Haven't found \"%s\" in password cache!"), (char *)key);
if (__builtin_expect (debug_level > 0, 0))
dbg_log (_("Haven't found \"%s\" in password cache!"), (char *) key);
if (secure[pwddb])
{
@ -218,15 +221,47 @@ addpwbyname (struct database *db, int fd, request_header *req,
while (__getpwnam_r (key, &resultbuf, buffer, buflen, &pwd) != 0
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
pwd = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[pwddb])
seteuid (oldeuid);
cache_addpw (db, fd, req, key, pwd, c_uid);
if (use_malloc)
free (buffer);
}
@ -239,23 +274,24 @@ addpwbyuid (struct database *db, int fd, request_header *req,
simply insert it. It does not matter if it is in there twice. The
pruning function only will look at the timestamp. */
int buflen = 256;
char *buffer = alloca (buflen);
char *buffer = (char *) alloca (buflen);
struct passwd resultbuf;
struct passwd *pwd;
uid_t oldeuid = 0;
char *ep;
uid_t uid = strtoul ((char*) key, &ep, 10);
if (*(char*)key == '\0' || *ep != '\0') /* invalid numeric uid */
uid_t uid = strtoul ((char *) key, &ep, 10);
bool use_malloc = false;
if (*(char *) key == '\0' || *ep != '\0') /* invalid numeric uid */
{
if (debug_level > 0)
dbg_log (_("Invalid numeric uid \"%s\"!"), (char *)key);
if (debug_level > 0)
dbg_log (_("Invalid numeric uid \"%s\"!"), (char *) key);
errno = EINVAL;
return;
}
if (debug_level > 0)
if (__builtin_expect (debug_level > 0, 0))
dbg_log (_("Haven't found \"%d\" in password cache!"), uid);
if (secure[pwddb])
@ -267,13 +303,45 @@ addpwbyuid (struct database *db, int fd, request_header *req,
while (__getpwuid_r (uid, &resultbuf, buffer, buflen, &pwd) != 0
&& errno == ERANGE)
{
char *old_buffer = buffer;
errno = 0;
buflen += 256;
buffer = alloca (buflen);
buflen += 1024;
if (__builtin_expect (buflen > 32768, 0))
{
buffer = (char *) realloc (use_malloc ? buffer : NULL, buflen);
if (buffer == NULL)
{
/* We ran out of memory. We cannot do anything but
sending a negative response. In reality this should
never happen. */
pwd = NULL;
buffer = old_buffer;
break;
}
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
}
}
if (secure[pwddb])
seteuid (oldeuid);
cache_addpw (db, fd, req, key, pwd, c_uid);
if (use_malloc)
free (buffer);
}