* nscd/nscd_helper.c (__nscd_cache_search): Prevent endless loops.

This commit is contained in:
Ulrich Drepper 2007-10-06 18:47:56 +00:00
parent c039eedd66
commit 8c7661bcd3
2 changed files with 8 additions and 1 deletions

View File

@ -1,5 +1,7 @@
2007-10-06 Ulrich Drepper <drepper@redhat.com> 2007-10-06 Ulrich Drepper <drepper@redhat.com>
* nscd/nscd_helper.c (__nscd_cache_search): Prevent endless loops.
[BZ #4407] [BZ #4407]
* sysdeps/ieee754/dbl-64/e_lgamma_r.c: Fix *signgamp for -0.0. * sysdeps/ieee754/dbl-64/e_lgamma_r.c: Fix *signgamp for -0.0.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c: Likewise. * sysdeps/ieee754/flt-32/e_lgammaf_r.c: Likewise.

View File

@ -416,7 +416,8 @@ __nscd_cache_search (request_type type, const char *key, size_t keylen,
unsigned long int hash = __nis_hash (key, keylen) % mapped->head->module; unsigned long int hash = __nis_hash (key, keylen) % mapped->head->module;
size_t datasize = mapped->datasize; size_t datasize = mapped->datasize;
ref_t work = mapped->head->array[hash]; ref_t first = mapped->head->array[hash];
ref_t work = first;
while (work != ENDREF && work + sizeof (struct hashentry) <= datasize) while (work != ENDREF && work + sizeof (struct hashentry) <= datasize)
{ {
struct hashentry *here = (struct hashentry *) (mapped->data + work); struct hashentry *here = (struct hashentry *) (mapped->data + work);
@ -454,6 +455,10 @@ __nscd_cache_search (request_type type, const char *key, size_t keylen,
} }
work = here->next; work = here->next;
/* Prevent endless loops. This should never happen but perhaps
the database got corrupted, accidentally or deliberately. */
if (work == first)
break;
} }
return NULL; return NULL;