From 0817d63dd1f8e165f8ef6590bf4feddf06705381 Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Wed, 28 Nov 2012 06:45:50 +0530 Subject: [PATCH] Fix hashtable size calculation when database has exactly one record The hash function needs a hashtable of at least size 3 or greater. --- ChangeLog | 7 +++++++ nss/makedb.c | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1a2e4da..7df91e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-11-28 Siddhesh Poyarekar + Carlos O'Donell + + * nss/makedb.c (is_prime): Assert that input is odd and greater + than 4. Note that fact in a comment too. + (next_prime): Add 4 to input. + 2012-11-27 Siddhesh Poyarekar [BZ #11741] diff --git a/nss/makedb.c b/nss/makedb.c index 8d7d027..e372f5d 100644 --- a/nss/makedb.c +++ b/nss/makedb.c @@ -591,13 +591,16 @@ copy_valstr (const void *nodep, const VISIT which, const int depth) } +/* Determine if the candidate is prime by using a modified trial division + algorithm. The candidate must be both odd and greater than 4. */ static int is_prime (size_t candidate) { - /* No even number and none less than 10 will be passed here. */ size_t divn = 3; size_t sq = divn * divn; + assert (candidate > 4 && candidate % 2 != 0); + while (sq < candidate && candidate % divn != 0) { ++divn; @@ -612,8 +615,8 @@ is_prime (size_t candidate) static size_t next_prime (size_t seed) { - /* Make it definitely odd. */ - seed |= 1; + /* Make sure that we're always greater than 4. */ + seed = (seed + 4) | 1; while (!is_prime (seed)) seed += 2; -- 2.7.4