1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 21:35:45 +02:00

crucible: fix further instances of copy-after-unlock bug

Before:

	unique_lock<mutex> lock(some_mutex);
	// run lock.~unique_lock() because return
	// return reference to unprotected heap
	return foo[bar];

After:

	unique_lock<mutex> lock(some_mutex);
	// make copy of object on heap protected by mutex lock
	auto tmp_copy = foo[bar];
	// run lock.~unique_lock() because return
	// pass locally allocated object to copy constructor
	return tmp_copy;

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2017-01-22 21:50:21 -05:00
parent c58e5cd75b
commit 6099bf0b01
3 changed files with 15 additions and 5 deletions

View File

@ -161,7 +161,10 @@ namespace crucible {
LockSet<T>::copy()
{
unique_lock<mutex> lock(m_mutex);
return m_set;
// Make temporary copy of set while protected by mutex
auto rv = m_set;
// Return temporary copy after releasing lock
return rv;
}
template <class T>

View File

@ -332,7 +332,9 @@ namespace crucible {
ResourceHandle<Key, Resource>::get_resource_ptr() const
{
unique_lock<mutex> lock(s_ptr_mutex);
return m_ptr;
// Make isolated copy of pointer with lock held, and return the copy
auto rv = m_ptr;
return rv;
}
template <class Key, class Resource>
@ -343,7 +345,9 @@ namespace crucible {
if (!m_ptr) {
THROW_ERROR(out_of_range, __PRETTY_FUNCTION__ << " called on null Resource");
}
return m_ptr;
// Make isolated copy of pointer with lock held, and return the copy
auto rv = m_ptr;
return rv;
}
template <class Key, class Resource>

View File

@ -124,7 +124,9 @@ namespace crucible {
if (m_set.empty()) {
return key_type();
} else {
return *m_set.begin();
// Make copy with lock held
auto rv = *m_set.begin();
return rv;
}
}
@ -149,7 +151,8 @@ namespace crucible {
WorkQueue<Task>::copy()
{
unique_lock<mutex> lock(m_mutex);
return m_set;
auto rv = m_set;
return rv;
}
template <class Task>