]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: fix the 'improve section parser' commit, fixes #5005
authorJaroslav Kysela <perex@perex.cz>
Tue, 20 Mar 2018 10:24:56 +0000 (11:24 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 20 Mar 2018 10:26:37 +0000 (11:26 +0100)
src/input/mpegts/dvb_psi_lib.c

index 9ee97b010794690497d20d01d4fd7fca64314309..1662d91198559cf6ee6825a3d6afec99a81a816c 100644 (file)
@@ -167,31 +167,31 @@ mpegts_psi_section_reassemble
   }
 
   if(pusi) {
-    uint8_t len = tsb[off++];
-    if (len > 188 - off) {
-      mt->mt_sect.ps_lock = 0;
-      return;
-    }
-    while (off < len) {
-      r = mpegts_psi_section_reassemble0(mt, logprefix, tsb + off, len, 0, crc, cb, opaque);
-      if (r < 0) {
-        mt->mt_sect.ps_lock = 0;
-        off = 188;
-        break;
-      }
-      off += r;
+    uint8_t len2 = tsb[off++];
+    uint8_t off2 = off;
+    off += len2;
+    if (off > 188)
+      goto wrong_state;
+    while (off2 < len2) {
+      r = mpegts_psi_section_reassemble0(mt, logprefix, tsb + off2, len2, 0, crc, cb, opaque);
+      if (r < 0)
+        goto wrong_state;
+      off2 += r;
+      len2 -= r;
     }
   }
 
   while(off < 188) {
     r = mpegts_psi_section_reassemble0(mt, logprefix, tsb + off, 188 - off, pusi, crc,
         cb, opaque);
-    if(r < 0) {
-      mt->mt_sect.ps_lock = 0;
-      break;
-    }
+    if (r < 0)
+      goto wrong_state;
     off += r;
   }
+  return;
+
+wrong_state:
+  mt->mt_sect.ps_lock = 0;
 }
 
 /*