Fix locking in DATA_ON_READERS when masked

In the case of when a DATA_ON_READERS listener is set, but with the
corresponding status mask is set to suppress the event, the reader lock
would not be in locked, resulting in a unlocked access of status flags
and a double unlock.

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2019-09-24 08:34:40 +02:00 committed by eboasson
parent 2775e2527c
commit d1ad60fdd1

View file

@ -114,7 +114,6 @@ void dds_reader_data_available_cb (struct dds_reader *rd)
if (lst->on_data_on_readers) if (lst->on_data_on_readers)
{ {
ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock); ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
ddsrt_mutex_lock (&sub->m_observers_lock); ddsrt_mutex_lock (&sub->m_observers_lock);
const uint32_t data_on_rds_enabled = (ddsrt_atomic_ld32 (&sub->m_status.m_status_and_mask) & (DDS_DATA_ON_READERS_STATUS << SAM_ENABLED_SHIFT)); const uint32_t data_on_rds_enabled = (ddsrt_atomic_ld32 (&sub->m_status.m_status_and_mask) & (DDS_DATA_ON_READERS_STATUS << SAM_ENABLED_SHIFT));
if (data_on_rds_enabled) if (data_on_rds_enabled)
@ -127,13 +126,13 @@ void dds_reader_data_available_cb (struct dds_reader *rd)
lst->on_data_on_readers (sub->m_hdllink.hdl, lst->on_data_on_readers_arg); lst->on_data_on_readers (sub->m_hdllink.hdl, lst->on_data_on_readers_arg);
ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
ddsrt_mutex_lock (&sub->m_observers_lock); ddsrt_mutex_lock (&sub->m_observers_lock);
sub->m_cb_count--; sub->m_cb_count--;
sub->m_cb_pending_count--; sub->m_cb_pending_count--;
ddsrt_cond_broadcast (&sub->m_observers_cond); ddsrt_cond_broadcast (&sub->m_observers_cond);
} }
ddsrt_mutex_unlock (&sub->m_observers_lock); ddsrt_mutex_unlock (&sub->m_observers_lock);
ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
} }
else if (rd->m_entity.m_listener.on_data_available) else if (rd->m_entity.m_listener.on_data_available)
{ {