From d1ad60fdd13993ab4becb983b6dbafc21028dda7 Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Tue, 24 Sep 2019 08:34:40 +0200 Subject: [PATCH] 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 --- src/core/ddsc/src/dds_reader.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/ddsc/src/dds_reader.c b/src/core/ddsc/src/dds_reader.c index 8f0a1cc..4fcf222 100644 --- a/src/core/ddsc/src/dds_reader.c +++ b/src/core/ddsc/src/dds_reader.c @@ -114,7 +114,6 @@ void dds_reader_data_available_cb (struct dds_reader *rd) if (lst->on_data_on_readers) { ddsrt_mutex_unlock (&rd->m_entity.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)); 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); - ddsrt_mutex_lock (&rd->m_entity.m_observers_lock); ddsrt_mutex_lock (&sub->m_observers_lock); sub->m_cb_count--; sub->m_cb_pending_count--; ddsrt_cond_broadcast (&sub->m_observers_cond); } 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) {