summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-05-15 21:33:43 -0700
committerPetr Baudis <pasky@suse.cz>2009-05-22 04:56:54 +0200
commit4c7cb20430af51ddebf270b423d5c4aec3b9f770 (patch)
treee6d170f24375f10fc145583d14ba85541257fae6
parentb9e0df9847f3460c67e27e631af8662e7906ed6b (diff)
downloadglibc-4c7cb20430af51ddebf270b423d5c4aec3b9f770.tar.gz
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. (cherry picked from commit 831a40494d44045c0caaf8085ab1d35c0da23140)
-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 a672e153bc..9001fb73c4 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 f66a658d2a..81ca3d56b9 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 3279b85432..632bf58dc5 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 db247962b9..80ee3e1dd9 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)
{