diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-10-06 18:47:56 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-10-06 18:47:56 +0000 |
commit | 8c7661bcd362416493b3088ddf176578b225fb18 (patch) | |
tree | cacd0e8da9410bf577f62185fffc1cd84ff93b2a /nscd | |
parent | c039eedd66aff3706fede2188d920e173543b8e8 (diff) | |
download | glibc-8c7661bcd362416493b3088ddf176578b225fb18.tar glibc-8c7661bcd362416493b3088ddf176578b225fb18.tar.gz glibc-8c7661bcd362416493b3088ddf176578b225fb18.tar.bz2 glibc-8c7661bcd362416493b3088ddf176578b225fb18.zip |
* nscd/nscd_helper.c (__nscd_cache_search): Prevent endless loops.
Diffstat (limited to 'nscd')
-rw-r--r-- | nscd/nscd_helper.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c index 5f3d54efcf..2e6d5f76b8 100644 --- a/nscd/nscd_helper.c +++ b/nscd/nscd_helper.c @@ -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; 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) { 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; + /* Prevent endless loops. This should never happen but perhaps + the database got corrupted, accidentally or deliberately. */ + if (work == first) + break; } return NULL; |