]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
various concurrent access fixes (cclang sanitizer)
authorJaroslav Kysela <perex@perex.cz>
Wed, 17 Jan 2018 18:29:23 +0000 (19:29 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 17 Jan 2018 18:29:23 +0000 (19:29 +0100)
src/descrambler/caclient.c
src/descrambler/capmt.c
src/descrambler/dvbcam.c
src/input/mpegts/tsdemux.c
src/subscriptions.c

index 2120b58afda096966c28662f7b7c3c158a22c921..58462b7bc626c83ba4efac87707ae6e38ecef815 100644 (file)
@@ -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);
   }
 }
 
index dcce0d85ed6309b94bc5287dea66d779f878d6f8..571bf8d4fa5e6e6cc7a25e072f43042517b13034 100644 (file)
@@ -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);
index 148c2f00d069e89d4dc2f95a8390945fd8684922..c23bcf670bae2291302ee29cbaf558fd6aa67912 100644 (file)
@@ -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();
+
 }
 
 /*
index 0ef03d298b019882f43ad59dba64a43d01ef2014..3b1ac1b02e87f5a9cd188610587bdc5bc4154f2e 100644 (file)
@@ -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);
 
index f585bbdbd4e6da2fd0e6612abcaa4de71c2520de..0b30b2af1ece7efaa210d63830aa4c9f193d00eb 100644 (file)
@@ -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);