diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-05-15 21:33:43 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-05-15 21:33:43 -0700 |
commit | 831a40494d44045c0caaf8085ab1d35c0da23140 (patch) | |
tree | 2a5336cdb2207583c2a42bc99ac8e4a8fbf3dbc7 /nscd/nscd_helper.c | |
parent | cfe1fc1013d0e7e4863c974fa0e78891cc0a2ed2 (diff) | |
download | glibc-831a40494d44045c0caaf8085ab1d35c0da23140.zip glibc-831a40494d44045c0caaf8085ab1d35c0da23140.tar.gz glibc-831a40494d44045c0caaf8085ab1d35c0da23140.tar.bz2 |
Further robustify nscd database lookup.
We can compute an absolute maximum for the number of elements which
can fit into the currently mapped database. Stop after that many
iterations.
Diffstat (limited to 'nscd/nscd_helper.c')
-rw-r--r-- | nscd/nscd_helper.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c index db24796..80ee3e1 100644 --- a/nscd/nscd_helper.c +++ b/nscd/nscd_helper.c @@ -481,6 +481,7 @@ __nscd_cache_search (request_type type, const char *key, size_t keylen, ref_t trail = mapped->head->array[hash]; trail = atomic_forced_read (trail); ref_t work = trail; + size_t loop_cnt = datasize / (offsetof (struct datahead, data) + datalen); int tick = 0; while (work != ENDREF && work + sizeof (struct hashentry) <= datasize) @@ -527,7 +528,7 @@ __nscd_cache_search (request_type type, const char *key, size_t keylen, work = atomic_forced_read (here->next); /* Prevent endless loops. This should never happen but perhaps the database got corrupted, accidentally or deliberately. */ - if (work == trail) + if (work == trail || loop_cnt-- > 0) break; if (tick) { |