From: Adam Sutton Date: Fri, 11 Jan 2013 12:26:30 +0000 (+0000) Subject: eit: fix a bug in EIT extended descriptor parsing. X-Git-Tag: v3.5~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=622531e385a5913105665caaa5e49d2b8a2c34b5;p=thirdparty%2Ftvheadend.git eit: fix a bug in EIT extended descriptor parsing. --- diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index d06a2264e..103464fef 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -269,9 +269,10 @@ static int _eit_desc_short_event static int _eit_desc_ext_event ( epggrab_module_t *mod, uint8_t *ptr, int len, eit_event_t *ev ) { - int r, nitem; + int r, ilen; char ikey[512], ival[512]; char buf[512], lang[4]; + uint8_t *iptr; if (len < 6) return -1; @@ -286,28 +287,34 @@ static int _eit_desc_ext_event ptr += 3; /* Key/Value items */ - nitem = *ptr; + ilen = *ptr; len -= 1; ptr += 1; - if (len < (2 * nitem) + 1) return -1; + iptr = ptr; + if (len < ilen) return -1; - while (nitem--) { + /* Skip past */ + ptr += ilen; + len -= ilen; + + /* Process */ + while (ilen) { /* Key */ if ( (r = _eit_get_string_with_len(mod, ikey, sizeof(ikey), - ptr, len, ev->default_charset)) < 0 ) - return -1; - - len -= r; - ptr += r; + iptr, ilen, ev->default_charset)) < 0 ) + break; + + ilen -= r; + iptr += r; /* Value */ if ( (r = _eit_get_string_with_len(mod, ival, sizeof(ival), - ptr, len, ev->default_charset)) < 0 ) - return -1; + iptr, ilen, ev->default_charset)) < 0 ) + break; - len -= r; - ptr += r; + ilen -= r; + iptr += r; /* Store */ // TODO: extend existing? @@ -323,9 +330,7 @@ static int _eit_desc_ext_event if ( _eit_get_string_with_len(mod, buf, sizeof(buf), ptr, len, - ev->default_charset) < 0 ) { - return -1; - } else { + ev->default_charset) > 0 ) { if (!ev->desc) ev->desc = lang_str_create(); lang_str_append(ev->desc, buf, lang); }