This is an automatic generated email to let you know that the following patch were queued at the http://git.linuxtv.org/v4l-utils.git tree:
Subject: libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private Author: André Roth <[email protected]> Date: Tue Mar 25 15:19:57 2014 -0300 - set list pointer to NULL in case of an error - improve size checking - dvb_desc_init is used only internal, remove from header [[email protected]: revert the change from calloc() to malloc()] Signed-off-by: André Roth <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]> lib/include/libdvbv5/descriptors.h | 2 - lib/libdvbv5/descriptors.c | 42 +++++++++++++++++------------------ 2 files changed, 20 insertions(+), 24 deletions(-) --- http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=be45253e3894248d79d8561deb0b7f38232736ee diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h index b482fa0..f4d9288 100644 --- a/lib/include/libdvbv5/descriptors.h +++ b/lib/include/libdvbv5/descriptors.h @@ -78,8 +78,6 @@ void dvb_desc_default_print (struct dvb_v5_fe_parms *parms, const struct dvb_de for( _struct *_desc = (_struct *) _tbl->descriptor; _desc; _desc = (_struct *) _desc->next ) \ if(_desc->type == _type) \ -ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc); - uint32_t bcd(uint32_t bcd); void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *buf, int len); diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c index 91cc4a6..9ddbe56 100644 --- a/lib/libdvbv5/descriptors.c +++ b/lib/libdvbv5/descriptors.c @@ -56,12 +56,11 @@ #include <libdvbv5/desc_partial_reception.h> #include <libdvbv5/desc_extension.h> -ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc) +static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc) { - desc->type = buf[0]; - desc->length = buf[1]; + desc->type = type; + desc->length = length; desc->next = NULL; - return 2; } void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc) @@ -94,17 +93,27 @@ char *default_charset = "iso-8859-1"; char *output_charset = "utf-8"; void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, - uint16_t section_length, struct dvb_desc **head_desc) + uint16_t buflen, struct dvb_desc **head_desc) { - const uint8_t *ptr = buf; + const uint8_t *ptr = buf, *endbuf = buf + buflen; struct dvb_desc *current = NULL; struct dvb_desc *last = NULL; - while (ptr + 2 < buf + section_length) { - unsigned desc_type = ptr[0]; - int desc_len = ptr[1]; + *head_desc = NULL; + + while (ptr + 2 <= endbuf ) { + uint8_t desc_type = ptr[0]; + uint8_t desc_len = ptr[1]; size_t size; + ptr += 2; /* skip type and length */ + + if (ptr + desc_len > endbuf) { + dvb_logerr("short read of %zd/%d bytes parsing descriptor %#02x", + endbuf - ptr, desc_len, desc_type); + return; + } + switch (parms->verbose) { case 0: case 1: @@ -120,12 +129,6 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, hexdump(parms, "content: ", ptr + 2, desc_len); } - if (desc_len > section_length - 2) { - dvb_logwarn("descriptor type 0x%02x is too big", - desc_type); - return; - } - dvb_desc_init_func init = dvb_descriptors[desc_type].init; if (!init) { init = dvb_desc_default_init; @@ -134,12 +137,7 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, size = dvb_descriptors[desc_type].size; } if (!size) { - dvb_logwarn("descriptor type 0x%02x has no size defined", desc_type); - size = 4096; - } - if (ptr + 2 >= buf + section_length) { - dvb_logwarn("descriptor type 0x%02x is truncated: desc len %d, section len %zd", - desc_type, desc_len, section_length - (ptr - buf)); + dvb_logerr("descriptor type 0x%02x has no size defined", desc_type); return; } @@ -148,7 +146,7 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, dvb_perror("Out of memory"); return; } - ptr += dvb_desc_init(ptr, current); /* the standard header was read */ + dvb_desc_init(desc_type, desc_len, current); /* initialize the standard header */ init(parms, ptr, current); if (!*head_desc) *head_desc = current; _______________________________________________ linuxtv-commits mailing list [email protected] http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits
