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)
+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.
/* 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
/* 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)
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)
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)
{