aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-05-15 21:33:43 -0700
committerUlrich Drepper <drepper@redhat.com>2009-05-15 21:33:43 -0700
commit831a40494d44045c0caaf8085ab1d35c0da23140 (patch)
tree2a5336cdb2207583c2a42bc99ac8e4a8fbf3dbc7
parentcfe1fc1013d0e7e4863c974fa0e78891cc0a2ed2 (diff)
downloadglibc-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--ChangeLog9
-rw-r--r--nscd/nscd-client.h7
-rw-r--r--nscd/nscd.h5
-rw-r--r--nscd/nscd_helper.c3
4 files changed, 17 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index aa415cb..bf3dd49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
{