diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-01-28 13:59:11 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-01-28 13:59:11 +0100 |
commit | bae7c7c764413b23e61cb099ce33be4c4ee259bb (patch) | |
tree | 8c643811b62f09a257324e9cc64dad1c17d94d2e /misc/bug18240.c | |
parent | 8a71d2e27fd067a85059aefb93c9ce83142b03e9 (diff) | |
download | glibc-bae7c7c764413b23e61cb099ce33be4c4ee259bb.tar.gz glibc-bae7c7c764413b23e61cb099ce33be4c4ee259bb.tar.xz glibc-bae7c7c764413b23e61cb099ce33be4c4ee259bb.zip |
Improve check against integer wraparound in hcreate_r [BZ #18240]
Diffstat (limited to 'misc/bug18240.c')
-rw-r--r-- | misc/bug18240.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/misc/bug18240.c b/misc/bug18240.c new file mode 100644 index 0000000000..4b26865a31 --- /dev/null +++ b/misc/bug18240.c @@ -0,0 +1,75 @@ +/* Test integer wraparound in hcreate. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <limits.h> +#include <search.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + +static void +test_size (size_t size) +{ + int res = hcreate (size); + if (res == 0) + { + if (errno == ENOMEM) + return; + printf ("error: hcreate (%zu): %m\n", size); + exit (1); + } + char *keys[100]; + for (int i = 0; i < 100; ++i) + { + if (asprintf (keys + i, "%d", i) < 0) + { + printf ("error: asprintf: %m\n"); + exit (1); + } + ENTRY e = { keys[i], (char *) "value" }; + if (hsearch (e, ENTER) == NULL) + { + printf ("error: hsearch (\"%s\"): %m\n", keys[i]); + exit (1); + } + } + hdestroy (); + + for (int i = 0; i < 100; ++i) + free (keys[i]); +} + +static int +do_test (void) +{ + test_size (500); + test_size (-1); + test_size (-3); + test_size (INT_MAX - 2); + test_size (INT_MAX - 1); + test_size (INT_MAX); + test_size (((unsigned) INT_MAX) + 1); + test_size (UINT_MAX - 2); + test_size (UINT_MAX - 1); + test_size (UINT_MAX); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |