summaryrefslogtreecommitdiff
path: root/misc/hsearch_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/hsearch_r.c')
-rw-r--r--misc/hsearch_r.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/misc/hsearch_r.c b/misc/hsearch_r.c
index 9f55e845cf..1fca6b3222 100644
--- a/misc/hsearch_r.c
+++ b/misc/hsearch_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1993.
@@ -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
@@ -62,9 +59,7 @@ isprime (unsigned int number)
The contents of the table is zeroed, especially the field used
becomes zero. */
int
-__hcreate_r (nel, htab)
- size_t nel;
- struct hsearch_data *htab;
+__hcreate_r (size_t nel, struct hsearch_data *htab)
{
/* Test for correct arguments. */
if (htab == NULL)
@@ -81,10 +76,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;
@@ -104,8 +108,7 @@ weak_alias (__hcreate_r, hcreate_r)
/* After using the hash table it has to be destroyed. The used memory can
be freed and the local static variable can be marked as not used. */
void
-__hdestroy_r (htab)
- struct hsearch_data *htab;
+__hdestroy_r (struct hsearch_data *htab)
{
/* Test for correct arguments. */
if (htab == NULL)
@@ -138,11 +141,8 @@ weak_alias (__hdestroy_r, hdestroy_r)
equality of the stored and the parameter value. This helps to prevent
unnecessary expensive calls of strcmp. */
int
-__hsearch_r (item, action, retval, htab)
- ENTRY item;
- ACTION action;
- ENTRY **retval;
- struct hsearch_data *htab;
+__hsearch_r (ENTRY item, ACTION action, ENTRY **retval,
+ struct hsearch_data *htab)
{
unsigned int hval;
unsigned int count;