Skip to content

Commit

Permalink
Further robustify nscd database lookup.
Browse files Browse the repository at this point in the history
We can compute an absolute maximum for the number of elements which
can fit into the currently mapped database.  Stop after that many
iterations.
  • Loading branch information
Ulrich Drepper committed May 16, 2009
1 parent cfe1fc1 commit 831a404
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 7 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
7 changes: 6 additions & 1 deletion nscd/nscd-client.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 0 additions & 5 deletions nscd/nscd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
3 changes: 2 additions & 1 deletion nscd/nscd_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 831a404

Please sign in to comment.