]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvbcam: fix s_stream_mutex locking in dvbcam_cat_update(), issue #4889
authorJaroslav Kysela <perex@perex.cz>
Sat, 27 Jan 2018 16:36:33 +0000 (17:36 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 27 Jan 2018 16:36:43 +0000 (17:36 +0100)
src/descrambler/dvbcam.c

index d9a3e40498cdb1b0d75b0539ef42493d4ac27c02..b9f99e0ba1e55ec5cf2b8df3a1612696bfe9eccc 100644 (file)
@@ -737,19 +737,19 @@ dvbcam_cat_update(caclient_t *cac, mpegts_mux_t *mux, const uint8_t *data, int l
     mi = mux->mm_active ? mux->mm_active->mmi_input : NULL;
     if (mi) {
       pthread_mutex_lock(&mi->mi_output_lock);
-      pthread_mutex_lock(&sp->service->s_stream_mutex);
       for (i = 0; i < services_count; i++) {
         sp = &services[i];
+        pthread_mutex_lock(&sp->service->s_stream_mutex);
         for (i = 0; i < sp->to_open.count; i++)
           mpegts_input_open_pid(mi, mux, sp->to_open.pids[i].pid, MPS_SERVICE,
                                MPS_WEIGHT_CAT, sp->service, 0);
         for (i = 0; i < sp->to_close.count; i++)
           mpegts_input_close_pid(mi, mux, sp->to_close.pids[i].pid, MPS_SERVICE,
                                  MPS_WEIGHT_CAT, sp->service);
+        pthread_mutex_unlock(&sp->service->s_stream_mutex);
         mpegts_pid_done(&sp->to_open);
         mpegts_pid_done(&sp->to_close);
       }
-      pthread_mutex_unlock(&sp->service->s_stream_mutex);
       pthread_mutex_unlock(&mi->mi_output_lock);
       mpegts_mux_update_pids(mux);
     }