]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
subscriptions: improve s_descramble_info locking (clang sanitizer)
authorJaroslav Kysela <perex@perex.cz>
Thu, 10 Mar 2016 18:10:26 +0000 (19:10 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 10 Mar 2016 18:10:26 +0000 (19:10 +0100)
src/descrambler/descrambler.c
src/subscriptions.c

index f7f316055f0d6553ebf0109cc00d14076f250e87..699c30043ee28221bf6a6705bea2a3a06a1ada1d 100644 (file)
@@ -335,10 +335,14 @@ static void
 descrambler_notify_deliver( mpegts_service_t *t, descramble_info_t *di, int locked )
 {
   streaming_message_t *sm;
+  int r;
 
+  pthread_mutex_lock(&t->s_stream_mutex);
   if (!t->s_descramble_info)
     t->s_descramble_info = calloc(1, sizeof(*di));
-  if (memcmp(t->s_descramble_info, di, sizeof(*di)) == 0) {
+  r = memcmp(t->s_descramble_info, di, sizeof(*di));
+  pthread_mutex_unlock(&t->s_stream_mutex);
+  if (r == 0) { /* identical */
     free(di);
     return;
   }
index c369ec51e8ac21a19d17ece4a98fffe1b1ed3810..c47382eba1bacdfdb8844f44f8aab444de1c23f8 100644 (file)
@@ -893,6 +893,7 @@ subscription_create_msg(th_subscription_t *s, const char *lang)
 {
   htsmsg_t *m = htsmsg_create_map();
   descramble_info_t *di;
+  service_t *t;
   profile_t *pro;
   char buf[256];
 
@@ -936,9 +937,10 @@ subscription_create_msg(th_subscription_t *s, const char *lang)
   if(s->ths_channel != NULL)
     htsmsg_add_str(m, "channel", channel_get_name(s->ths_channel));
   
-  if(s->ths_service != NULL) {
-    htsmsg_add_str(m, "service", s->ths_service->s_nicename ?: "");
+  if((t = s->ths_service) != NULL) {
+    htsmsg_add_str(m, "service", t->s_nicename ?: "");
 
+    pthread_mutex_lock(&t->s_stream_mutex);
     if ((di = s->ths_service->s_descramble_info) != NULL) {
       if (di->caid == 0 && di->ecmtime == 0) {
         snprintf(buf, sizeof(buf), N_("Failed"));
@@ -949,6 +951,7 @@ subscription_create_msg(th_subscription_t *s, const char *lang)
       }
       htsmsg_add_str(m, "descramble", buf);
     }
+    pthread_mutex_unlock(&t->s_stream_mutex);
 
     if (s->ths_prch != NULL) {
       pro = s->ths_prch->prch_pro;