about summary refs log tree commit diff
path: root/misc/hsearch_r.c
diff options
context:
space:
mode:
authorGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>2016-05-25 10:04:06 -0300
committerGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>2016-05-25 10:04:06 -0300
commit2feb372c585eb77141adbff24d4958e5a5e6678a (patch)
tree79416b255a6e61e6fdbc913da3be86d87a8a25ff /misc/hsearch_r.c
parentc69c361ca6bf95f8c665884ee863168a321d472a (diff)
parent916ef0f69613613e11123657bff127bd26104630 (diff)
downloadglibc-2feb372c585eb77141adbff24d4958e5a5e6678a.tar.gz
glibc-2feb372c585eb77141adbff24d4958e5a5e6678a.tar.xz
glibc-2feb372c585eb77141adbff24d4958e5a5e6678a.zip
Merge release/2.20/master into ibm/2.20/master ibm/2.20/master
Conflicts:
	NEWS
Diffstat (limited to 'misc/hsearch_r.c')
-rw-r--r--misc/hsearch_r.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c
index 81c27d800c..af5521234c 100644
--- a/misc/hsearch_r.c
+++ b/misc/hsearch_r.c
@@ -19,7 +19,7 @@
 #include <errno.h>
 #include <malloc.h>
 #include <string.h>
-
+#include <stdint.h>
 #include <search.h>
 
 /* [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986
@@ -46,15 +46,12 @@ static int
 isprime (unsigned int number)
 {
   /* no even number will be passed */
-  unsigned int div = 3;
-
-  while (div * div < number && number % div != 0)
-    div += 2;
-
-  return number % div != 0;
+  for (unsigned int div = 3; div <= number / div; div += 2)
+    if (number % div == 0)
+      return 0;
+  return 1;
 }
 
-
 /* Before using the hash table we must allocate memory for it.
    Test for an existing table are done. We allocate one element
    more as the found prime number says. This is done for more effective
@@ -81,10 +78,19 @@ hcreate_r (nel, htab)
      use will not work.  */
   if (nel < 3)
     nel = 3;
-  /* Change nel to the first prime number not smaller as nel. */
-  nel |= 1;      /* make odd */
-  while (!isprime (nel))
-    nel += 2;
+
+  /* Change nel to the first prime number in the range [nel, UINT_MAX - 2],
+     The '- 2' means 'nel += 2' cannot overflow.  */
+  for (nel |= 1; ; nel += 2)
+    {
+      if (UINT_MAX - 2 < nel)
+	{
+	  __set_errno (ENOMEM);
+	  return 0;
+	}
+      if (isprime (nel))
+	break;
+    }
 
   htab->size = nel;
   htab->filled = 0;