diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-08-16 12:33:16 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-08-16 12:33:16 +0100 |
commit | 32917686b0ebb596fe0d783328a771c4dfd759ef (patch) | |
tree | bef37ad2a61004e130733c3790b8c0f4d450509c /libstdc++-v3/testsuite/23_containers/vector/bool | |
parent | f4eec0a3e34cd709476b5062e44ef0075c75f426 (diff) | |
download | gcc-32917686b0ebb596fe0d783328a771c4dfd759ef.tar.gz |
PR 72847 Prevent double-free in std::vector<bool>
PR libstdc++/72847
* include/bits/stl_bvector.h (_Bvector_base::_M_deallocate): Zero
pointers to start and end of storage.
* testsuite/23_containers/vector/bool/72847.cc: New test.
* include/bits/vector.tcc (vector<bool>::_M_reallocate): Only update
_M_finish after deallocating.
(vector<bool>::_M_fill_insert): Likewise.
(vector<bool>::_M_insert_range): Likewise.
(vector<bool>::_M_insert_aux): Likewise.
From-SVN: r239497
Diffstat (limited to 'libstdc++-v3/testsuite/23_containers/vector/bool')
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc new file mode 100644 index 00000000000..7bd8b396efd --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/72847.cc @@ -0,0 +1,49 @@ +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-require-cstdint "" } +// { dg-skip-if "" { *-*-* } { "-fno-exceptions" } } + +#include <vector> +#include <ext/throw_allocator.h> +#include <testsuite_hooks.h> + +// PR libstdc++/72847 +void +test01() +{ + bool test __attribute((unused)) = true; + + typedef bool value_type; + typedef __gnu_cxx::throw_allocator_limit<value_type> allocator_type; + typedef std::vector<value_type, allocator_type> test_type; + test_type v1(1, false); + test_type v2(v1.capacity()+1, false); + allocator_type::set_limit(0); + try { + v1 = v2; + } catch (const __gnu_cxx::forced_error&) { + } + // throw_allocator will throw if double-free happens +} + +// Container requirement testing, exceptional behavior +int main() +{ + test01(); + return 0; +} |