diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-08-30 20:10:56 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-08-30 20:10:56 +0200 |
commit | 5898f4548efdcd7c0fd437a74eeb80facc51a117 (patch) | |
tree | 3388b5acb0e092a716110ba3cfe176b01d3e72d8 /malloc/tst-dynarray.c | |
parent | a9da0bb2667ab20f1dbcd0a9ae6846db02fbc96a (diff) | |
download | glibc-5898f4548efdcd7c0fd437a74eeb80facc51a117.tar.gz glibc-5898f4548efdcd7c0fd437a74eeb80facc51a117.tar.xz glibc-5898f4548efdcd7c0fd437a74eeb80facc51a117.zip |
dynarray: Set errno on overflow-induced allocation failure
This allows the caller to return directly on such an error, with an appropriate errno value.
Diffstat (limited to 'malloc/tst-dynarray.c')
-rw-r--r-- | malloc/tst-dynarray.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c index 2206d75e31..d11f7bb8a3 100644 --- a/malloc/tst-dynarray.c +++ b/malloc/tst-dynarray.c @@ -18,6 +18,9 @@ #include "tst-dynarray-shared.h" +#include <errno.h> +#include <stdint.h> + #define DYNARRAY_STRUCT dynarray_long #define DYNARRAY_ELEMENT long #define DYNARRAY_PREFIX dynarray_long_ @@ -463,6 +466,31 @@ test_long_init (void) } } +/* Test overflow in resize. */ +static void +test_long_overflow (void) +{ + { + struct dynarray_long dyn; + dynarray_long_init (&dyn); + errno = EINVAL; + TEST_VERIFY (!dynarray_long_resize + (&dyn, (SIZE_MAX / sizeof (long)) + 1)); + TEST_VERIFY (errno == ENOMEM); + TEST_VERIFY (dynarray_long_has_failed (&dyn)); + } + + { + struct dynarray_long_noscratch dyn; + dynarray_long_noscratch_init (&dyn); + errno = EINVAL; + TEST_VERIFY (!dynarray_long_noscratch_resize + (&dyn, (SIZE_MAX / sizeof (long)) + 1)); + TEST_VERIFY (errno == ENOMEM); + TEST_VERIFY (dynarray_long_noscratch_has_failed (&dyn)); + } +} + /* Test NUL-terminated string construction with the add function and the simple finalize function. */ static void @@ -538,6 +566,7 @@ do_test (void) test_int (); test_str (); test_long_init (); + test_long_overflow (); test_zstr (); return 0; } |