From 4e55a827efd8743155517035ba8db52e47c42c24 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 17 Jan 2018 19:29:23 +0100 Subject: [PATCH] various concurrent access fixes (cclang sanitizer) --- src/descrambler/caclient.c | 2 +- src/descrambler/capmt.c | 5 +++-- src/descrambler/dvbcam.c | 11 ++++++++--- src/input/mpegts/tsdemux.c | 8 +++++--- src/subscriptions.c | 2 ++ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/descrambler/caclient.c b/src/descrambler/caclient.c index 2120b58af..58462b7bc 100644 --- a/src/descrambler/caclient.c +++ b/src/descrambler/caclient.c @@ -382,7 +382,7 @@ caclient_set_status(caclient_t *cac, caclient_status_t status) { if (cac->cac_status != status) { cac->cac_status = status; - idnode_notify_changed(&cac->cac_id); + idnode_lnotify_changed(&cac->cac_id); } } diff --git a/src/descrambler/capmt.c b/src/descrambler/capmt.c index dcce0d85e..571bf8d4f 100644 --- a/src/descrambler/capmt.c +++ b/src/descrambler/capmt.c @@ -312,8 +312,7 @@ static void capmt_send_client_info(capmt_t *capmt); static inline const char * capmt_name(capmt_t *capmt) { - return idnode_get_title(&capmt->cac_id, NULL, - capmt->capmt_name, sizeof(capmt->capmt_name)); + return capmt->capmt_name; } static inline int @@ -2543,6 +2542,8 @@ capmt_conf_changed(caclient_t *cac) capmt_t *capmt = (capmt_t *)cac; pthread_t tid; + idnode_get_title(&capmt->cac_id, NULL, + capmt->capmt_name, sizeof(capmt->capmt_name)); if (capmt->cac_enabled) { if (capmt->capmt_sockfile == NULL || capmt->capmt_sockfile[0] == '\0') { caclient_set_status(cac, CACLIENT_STATUS_NONE); diff --git a/src/descrambler/dvbcam.c b/src/descrambler/dvbcam.c index 148c2f00d..c23bcf670 100644 --- a/src/descrambler/dvbcam.c +++ b/src/descrambler/dvbcam.c @@ -83,9 +83,11 @@ dvbcam_status_update0(caclient_t *cac) { int status = CACLIENT_STATUS_NONE; + pthread_mutex_lock(&dvbcam_mutex); if (TAILQ_FIRST(&dvbcam_active_cams)) status = CACLIENT_STATUS_CONNECTED; caclient_set_status(cac, status); + pthread_mutex_unlock(&dvbcam_mutex); } /* @@ -166,7 +168,7 @@ dvbcam_register_cam(linuxdvb_ca_t * lca, uint16_t * caids, int caids_count) { dvbcam_active_cam_t *ac, *ac_first; - int registered = 0; + int registered = 0, call_update = 0; tvhtrace(LS_DVBCAM, "register cam %p caids_count %u", lca->lca_name, caids_count); @@ -193,11 +195,14 @@ dvbcam_register_cam(linuxdvb_ca_t * lca, uint16_t * caids, if (!registered) TAILQ_INSERT_TAIL(&dvbcam_active_cams, ac, global_link); - if (ac_first == NULL) - dvbcam_status_update(); + call_update = ac_first == NULL; reterr: pthread_mutex_unlock(&dvbcam_mutex); + + if (call_update == NULL) + dvbcam_status_update(); + } /* diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index 0ef03d298..3b1ac1b02 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -300,11 +300,13 @@ ts_recv_packet1 tsb[0], tsb[1], tsb[2], tsb[3], tsb[4], tsb[5]); #endif + pthread_mutex_lock(&t->s_stream_mutex); + /* Service inactive - ignore */ - if(t->s_status != SERVICE_RUNNING) + if(t->s_status != SERVICE_RUNNING) { + pthread_mutex_unlock(&t->s_stream_mutex); return 0; - - pthread_mutex_lock(&t->s_stream_mutex); + } service_set_streaming_status_flags((service_t*)t, TSS_INPUT_HARDWARE); diff --git a/src/subscriptions.c b/src/subscriptions.c index f585bbdbd..0b30b2af1 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -388,8 +388,10 @@ subscription_reschedule(void) tvhwarn(LS_SUBSCRIPTION, "%04X: service instance is bad, reason: %s", shortid(s), streaming_code2txt(s->ths_testing_error)); + pthread_mutex_lock(&t->s_stream_mutex); t->s_streaming_status = 0; t->s_status = SERVICE_IDLE; + pthread_mutex_unlock(&t->s_stream_mutex); si = s->ths_current_instance; assert(si != NULL); -- 2.47.3