From: Jaroslav Kysela Date: Tue, 20 Mar 2018 10:24:56 +0000 (+0100) Subject: dvb psi: fix the 'improve section parser' commit, fixes #5005 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=223fb7a44ced1e9597ea46fe45b56e9174862f56;p=thirdparty%2Ftvheadend.git dvb psi: fix the 'improve section parser' commit, fixes #5005 --- diff --git a/src/input/mpegts/dvb_psi_lib.c b/src/input/mpegts/dvb_psi_lib.c index 5796ecf9b..c97d51059 100644 --- a/src/input/mpegts/dvb_psi_lib.c +++ b/src/input/mpegts/dvb_psi_lib.c @@ -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; } /*