PR libstdc++/81891 fix double-free in hashtable constructor

PR libstdc++/81891
	* include/bits/hashtable.h (_Hashtable(_InputIterator, _InputIterator,
	size_type, const _H1&, const _H2&, const _Hash&, const _Equal&,
	const _ExtractKey&, const allocator_type&)): Let destructor do clean
	up if an exception is thrown.
	* testsuite/23_containers/unordered_map/cons/81891.cc: New.

From-SVN: r251185
This commit is contained in:
Jonathan Wakely 2017-08-18 18:46:57 +01:00 committed by Jonathan Wakely
parent 419d55e8df
commit 676c4146f5
3 changed files with 79 additions and 11 deletions

View file

@ -1,3 +1,12 @@
2017-08-18 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/81891
* include/bits/hashtable.h (_Hashtable(_InputIterator, _InputIterator,
size_type, const _H1&, const _H2&, const _Hash&, const _Equal&,
const _ExtractKey&, const allocator_type&)): Let destructor do clean
up if an exception is thrown.
* testsuite/23_containers/unordered_map/cons/81891.cc: New.
2017-08-11 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/81808

View file

@ -973,17 +973,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_bucket_count = __bkt_count;
}
__try
{
for (; __f != __l; ++__f)
this->insert(*__f);
}
__catch(...)
{
clear();
_M_deallocate_buckets();
__throw_exception_again;
}
for (; __f != __l; ++__f)
this->insert(*__f);
}
template<typename _Key, typename _Value,

View file

@ -0,0 +1,68 @@
// Copyright (C) 2017 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-do run { target c++11 } }
#include <unordered_map>
#include <testsuite_hooks.h>
#include <testsuite_allocator.h>
struct fails_on_copy {
fails_on_copy() = default;
fails_on_copy(const fails_on_copy&) { throw 0; };
};
using value_type = std::pair<int, fails_on_copy>;
void
test01()
{
value_type p;
try
{
std::unordered_map<int, fails_on_copy> umap(&p, &p + 1);
}
catch(...)
{ }
}
void
test02()
{
using Alloc = __gnu_test::tracker_allocator<value_type>;
using std::hash;
using std::equal_to;
value_type p;
try
{
std::unordered_map<int, fails_on_copy, hash<int>, equal_to<int>, Alloc>
umap(&p, &p + 1);
}
catch(...)
{ }
using counter = __gnu_test::tracker_allocator_counter;
VERIFY(counter::get_allocation_count() == counter::get_deallocation_count());
}
int
main()
{
test01();
test02();
}