]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
service/subscription: do not allow to subscribe services without PMT
authorJaroslav Kysela <perex@perex.cz>
Mon, 25 Apr 2016 11:27:20 +0000 (13:27 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 25 Apr 2016 11:30:01 +0000 (13:30 +0200)
src/input/mpegts/mpegts_service.c
src/service.c
src/service.h
src/service_mapper.c
src/streaming.c
src/tvheadend.h

index fe502afbec5acccfbeb47a521e8ef18b88b2b950..704369ee852f44f751511892e86b7e1f32d749d1 100644 (file)
@@ -280,7 +280,7 @@ mpegts_service_config_save ( service_t *t, char *filename, size_t fsize )
 /*
  * Service instance list
  */
-static void
+static int
 mpegts_service_enlist
   ( service_t *t, tvh_input_t *ti, struct service_instance_list *sil,
     int flags, int weight )
@@ -293,6 +293,10 @@ mpegts_service_enlist
 
   assert(s->s_source_type == S_MPEG_TS);
 
+  /* invalid PMT */
+  if (s->s_pmt_pid <= 0 || s->s_pmt_pid >= 8191)
+    return SM_CODE_INVALID_SERVICE;
+
   /* Create instances */
   m->mm_create_instances(m);
 
@@ -322,6 +326,8 @@ mpegts_service_enlist
 
     service_instance_add(sil, t, mi->mi_instance, mi->mi_name, p, w);
   }
+
+  return 0;
 }
 
 /*
index 244c9b07ac96e217f1899e3429ff4ebae1562539..f1e302e342f77f06c2b4f417dccd1f1acac9405a 100644 (file)
@@ -697,7 +697,7 @@ service_find_instance
   idnode_list_mapping_t *ilm;
   service_instance_t *si, *next;
   profile_t *pro = prch ? prch->prch_pro : NULL;
-  int enlisted;
+  int enlisted, r, r1;
 
   lock_assert(&global_lock);
 
@@ -705,6 +705,7 @@ service_find_instance
   TAILQ_FOREACH(si, sil, si_link)
     si->si_mark = 1;
 
+  r = 0;
   if (ch) {
     if (!ch->ch_enabled) {
       *error = SM_CODE_SVC_NOT_ENABLED;
@@ -718,20 +719,34 @@ service_find_instance
             pro->pro_svfilter == PROFILE_SVF_NONE ||
             (pro->pro_svfilter == PROFILE_SVF_SD && service_is_sdtv(s)) ||
             (pro->pro_svfilter == PROFILE_SVF_HD && service_is_hdtv(s))) {
-          s->s_enlist(s, ti, sil, flags, weight);
-          enlisted++;
+          r1 = s->s_enlist(s, ti, sil, flags, weight);
+          if (r1 == 0)
+            enlisted++;
+          else if (enlisted == 0)
+            r = r1;
         }
       }
     }
     if (enlisted == 0) {
       LIST_FOREACH(ilm, &ch->ch_services, ilm_in2_link) {
         s = (service_t *)ilm->ilm_in1;
-        if (s->s_is_enabled(s, flags))
-          s->s_enlist(s, ti, sil, flags, weight);
+        if (s->s_is_enabled(s, flags)) {
+          r1 = s->s_enlist(s, ti, sil, flags, weight);
+          if (r1 == 0)
+            enlisted++;
+          else if (enlisted == 0)
+            r = r1;
+        }
       }
     }
   } else {
-    s->s_enlist(s, ti, sil, flags, weight);
+    r = s->s_enlist(s, ti, sil, flags, weight);
+  }
+
+  if (r) {
+    if (*error < r)
+      *error = r;
+    return NULL;
   }
 
   /* Clean */
index a568ccd3b500c6cf4bf6756998e448e64f892eed..0470d83523e5a592e75085f0553fdeaf87323bb5 100644 (file)
@@ -310,8 +310,8 @@ typedef struct service {
 
   int (*s_is_enabled)(struct service *t, int flags);
 
-  void (*s_enlist)(struct service *s, struct tvh_input *ti,
-                   service_instance_list_t *sil, int flags, int weight);
+  int (*s_enlist)(struct service *s, struct tvh_input *ti,
+                  service_instance_list_t *sil, int flags, int weight);
 
   int (*s_start_feed)(struct service *s, int instance, int weight, int flags);
 
index 72147f8201cb8d69602b7647f240c2c88cb934ac..1b3ed70c5811135d31a8afbdbe3c86c88c9946be 100644 (file)
@@ -392,7 +392,7 @@ service_mapper_thread ( void *aux )
     subscription_unsubscribe(sub, UNSUBSCRIBE_FINAL);
 
     if(err) {
-      tvhinfo("service_mapper", "%s: failed [err %s]", s->s_nicename, err);
+      tvhinfo("service_mapper", "%s: failed [reason: %s]", s->s_nicename, err);
       service_mapper_stat.fail++;
     } else
       service_mapper_process(&smi->conf, s, NULL);
index e6925091af71281b43f4ef79fb95a99a7dc86a4e..f6e846b9b934e0b7520e4a97067a49a8c51fd5cd 100644 (file)
@@ -445,6 +445,8 @@ streaming_code2txt(int code)
     return N_("No service assigned to channel");
   case SM_CODE_NO_ADAPTERS:
     return N_("No assigned adapters");
+  case SM_CODE_INVALID_SERVICE:
+    return N_("Invalid service");
 
   case SM_CODE_ABORTED:
     return N_("Aborted by user");
index 62cd39862a266394d57dad5d1e96ce18f47c86bb..c11e75a561bc47d247aa59c0e0cbbdb61f82221b 100644 (file)
@@ -530,6 +530,7 @@ typedef enum {
 #define SM_CODE_NO_SERVICE                207
 #define SM_CODE_NO_VALID_ADAPTER          208
 #define SM_CODE_NO_ADAPTERS               209
+#define SM_CODE_INVALID_SERVICE           210
 
 #define SM_CODE_ABORTED                   300