diff options
author | Florian Weimer <fweimer@redhat.com> | 2012-11-05 18:48:46 +0100 |
---|---|---|
committer | Florian Weimer <fw@gcc.gnu.org> | 2012-11-05 18:48:46 +0100 |
commit | 6d0ae0359c02628fa469d393739d564a630874b1 (patch) | |
tree | 9a13f9e7ac82123b90ffc03ec641ccc88a9e23ce /libstdc++-v3/testsuite | |
parent | 0be1a5898f27445828da307df1c8cd62c800be03 (diff) | |
download | gcc-6d0ae0359c02628fa469d393739d564a630874b1.zip gcc-6d0ae0359c02628fa469d393739d564a630874b1.tar.gz gcc-6d0ae0359c02628fa469d393739d564a630874b1.tar.bz2 |
Detect overflow in size calculations in __cxa_vec_new{2,3}
2012-11-03 Florian Weimer <fweimer@redhat.com>
* libsupc++/vec.cc (compute_size): New.
(__cxa_vec_new2, __cxa_vec_new3): Use it.
* testsuite/18_support/cxa_vec.cc: New.
From-SVN: r193174
Diffstat (limited to 'libstdc++-v3/testsuite')
-rw-r--r-- | libstdc++-v3/testsuite/18_support/cxa_vec.cc | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/18_support/cxa_vec.cc b/libstdc++-v3/testsuite/18_support/cxa_vec.cc new file mode 100644 index 0000000..08713f1 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/cxa_vec.cc @@ -0,0 +1,64 @@ +// { dg-do run } +// Avoid use of none-overridable new/delete operators in shared +// { dg-options "-static" { target *-*-mingw* } } +// Test __cxa_vec routines +// Copyright (C) 2000-2012 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Apr 2000 <nathan@nathan@codesourcery.com> + +#include <cxxabi.h> +#include <stdio.h> +#include <new> +#include <stdlib.h> +#include <setjmp.h> + +// Allocate enough padding to hold an array cookie. +#ifdef __ARM_EABI__ +static const size_t padding = 8; +#else +static const size_t padding = (sizeof (std::size_t)); +#endif + +// our pseudo ctors and dtors +static abi::__cxa_cdtor_return_type ctor (void *x) +{ + abort (); +} + +static abi::__cxa_cdtor_return_type dtor (void *x) +{ + abort (); +} + +// allocate an array whose size causes an overflow during multiplication +void test1 () +{ + static const std::size_t large_size = + std::size_t(1) << (sizeof(std::size_t) * 8 - 2); + try + { + abi::__cxa_vec_new (large_size, 8, 0, ctor, dtor); + abort (); + } + catch (std::bad_alloc &) + { + } +} + +// allocate an array whose size causes an overflow during addition +void test2 () +{ + try + { + abi::__cxa_vec_new (std::size_t(-1) / 4, 4, padding, ctor, dtor); + abort (); + } + catch (std::bad_alloc &) + { + } +} + +int main () +{ + test1 (); + test2 (); +} |