summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/23_containers/vector/bool
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-08-16 12:33:16 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-08-16 12:33:16 +0100
commit32917686b0ebb596fe0d783328a771c4dfd759ef (patch)
treebef37ad2a61004e130733c3790b8c0f4d450509c /libstdc++-v3/testsuite/23_containers/vector/bool
parentf4eec0a3e34cd709476b5062e44ef0075c75f426 (diff)
downloadgcc-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.cc49
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;
+}