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 | |
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.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | nscd/nscd-client.h | 7 | ||||
-rw-r--r-- | nscd/nscd.h | 5 | ||||
-rw-r--r-- | nscd/nscd_helper.c | 3 |
4 files changed, 17 insertions, 7 deletions
@@ -1,3 +1,12 @@ +2009-05-15 Ulrich Drepper <drepper@redhat.com> + + * nscd/nscd.h: Move Definition for BLOCK_ALIGN_LOG, BLOCK_ALIGN, and + BLOCK_ALIGN_M1 to ... + * nscd/nscd-client.h: ...here. + * nscd/nscd_helper.c (__nscd_cache_search): Introduce loop counter. + Use it if we absolutely cannot reach any more correct list elements + because that many do not fit into the currently mapped database. + 2009-05-14 Jakub Jelinek <jakub@redhat.com> * nscd/nscd_helper.c: Include stddef.h. diff --git a/nscd/nscd-client.h b/nscd/nscd-client.h index f66a658..81ca3d5 100644 --- a/nscd/nscd-client.h +++ b/nscd/nscd-client.h @@ -44,9 +44,14 @@ /* Path for the configuration file. */ #define _PATH_NSCDCONF "/etc/nscd.conf" -/* Maximu allowed length for the key. */ +/* Maximum allowed length for the key. */ #define MAXKEYLEN 1024 +/* Maximum alignment requirement we will encounter. */ +#define BLOCK_ALIGN_LOG 3 +#define BLOCK_ALIGN (1 << BLOCK_ALIGN_LOG) +#define BLOCK_ALIGN_M1 (BLOCK_ALIGN - 1) + /* Available services. */ typedef enum diff --git a/nscd/nscd.h b/nscd/nscd.h index 3279b85..632bf58 100644 --- a/nscd/nscd.h +++ b/nscd/nscd.h @@ -111,11 +111,6 @@ struct database_dyn /* Path used when not using persistent storage. */ #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX" -/* Maximum alignment requirement we will encounter. */ -#define BLOCK_ALIGN_LOG 3 -#define BLOCK_ALIGN (1 << BLOCK_ALIGN_LOG) -#define BLOCK_ALIGN_M1 (BLOCK_ALIGN - 1) - /* Default value for the maximum size of the database files. */ #define DEFAULT_MAX_DB_SIZE (32 * 1024 * 1024) 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) { |