Fix hashtable size calculation when database has exactly one record
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 28 Nov 2012 01:15:50 +0000 (06:45 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Wed, 28 Nov 2012 01:15:50 +0000 (06:45 +0530)
The hash function needs a hashtable of at least size 3 or greater.

ChangeLog
nss/makedb.c

index 1a2e4da..7df91e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-11-28  Siddhesh Poyarekar  <siddhesh@redhat.com>
+           Carlos O'Donell  <carlos_odonell@mentor.com>
+
+       * 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  <siddhesh@redhat.com>
 
        [BZ #11741]
index 8d7d027..e372f5d 100644 (file)
@@ -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;