1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-18 05:45: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() LockSet<T>::copy()
{ {
unique_lock<mutex> lock(m_mutex); 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> template <class T>

View File

@ -332,7 +332,9 @@ namespace crucible {
ResourceHandle<Key, Resource>::get_resource_ptr() const ResourceHandle<Key, Resource>::get_resource_ptr() const
{ {
unique_lock<mutex> lock(s_ptr_mutex); 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> template <class Key, class Resource>
@ -343,7 +345,9 @@ namespace crucible {
if (!m_ptr) { if (!m_ptr) {
THROW_ERROR(out_of_range, __PRETTY_FUNCTION__ << " called on null Resource"); 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> template <class Key, class Resource>

View File

@ -124,7 +124,9 @@ namespace crucible {
if (m_set.empty()) { if (m_set.empty()) {
return key_type(); return key_type();
} else { } 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() WorkQueue<Task>::copy()
{ {
unique_lock<mutex> lock(m_mutex); unique_lock<mutex> lock(m_mutex);
return m_set; auto rv = m_set;
return rv;
} }
template <class Task> template <class Task>