From patchwork Sat Jan 4 17:07:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andr=C3=A9_Roth?= X-Patchwork-Id: 3433821 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 0ECDCC02DC for ; Sat, 4 Jan 2014 17:09:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C8F312015A for ; Sat, 4 Jan 2014 17:09:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B392320145 for ; Sat, 4 Jan 2014 17:09:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752977AbaADRIm (ORCPT ); Sat, 4 Jan 2014 12:08:42 -0500 Received: from mail-ea0-f181.google.com ([209.85.215.181]:49388 "EHLO mail-ea0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751279AbaADRIl (ORCPT ); Sat, 4 Jan 2014 12:08:41 -0500 Received: by mail-ea0-f181.google.com with SMTP id m10so7258616eaj.12 for ; Sat, 04 Jan 2014 09:08:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; bh=RQA+SRkUyRIs1rNx/CI/mz18HL7756HDnlRQXHuTggw=; b=vg+zgAynObR1fDPE/gp7sswl0jQ6+c1omWLXXYdMtNiPEy3IUss2sWv8BqSbtijBiE FTXYKosY0ZQSLsAU5fKzqEdLKo9pcmxvlcwJqP/v0AW3C9sLNfQfDiSRhq8XWOkAdF7d 379TJE/zwKzLNrOx6clSSafPMsMjrdE060pw1DKRmpq5aHpvvR4lI7kcKc7qxFA5YoRX UOjLvj2WhBxLy7oLRhyNHAZuctZxnA4JeQWR13+bhAo92D65wLk+CsPfqYUVNDIjthnv dVBOlzOdGxEJ7tJUx6nLPQVB7+DpmyCF+64ukPRMboV4pkAFuGR8f9/k1pFBE3e2Uj4L RPFA== X-Received: by 10.14.173.7 with SMTP id u7mr78990516eel.24.1388855320186; Sat, 04 Jan 2014 09:08:40 -0800 (PST) Received: from exciton.exnihilo. (140-227.61-188.cust.bluewin.ch. [188.61.227.140]) by mx.google.com with ESMTPSA id e3sm155011641eeg.11.2014.01.04.09.08.38 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 04 Jan 2014 09:08:39 -0800 (PST) From: =?UTF-8?q?Andr=C3=A9=20Roth?= To: linux-media@vger.kernel.org Cc: =?UTF-8?q?Andr=C3=A9=20Roth?= Subject: [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private Date: Sat, 4 Jan 2014 18:07:51 +0100 Message-Id: <1388855282-19295-1-git-send-email-neolynx@gmail.com> X-Mailer: git-send-email 1.7.10.4 MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: André Roth --- lib/include/libdvbv5/descriptors.h | 2 -- lib/libdvbv5/descriptors.c | 44 ++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h index 6f89aeb..36bcc61 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 a2176b4..626f81d 100644 --- a/lib/libdvbv5/descriptors.c +++ b/lib/libdvbv5/descriptors.c @@ -56,12 +56,11 @@ #include #include -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,16 +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 < 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: @@ -119,11 +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 %0x02x is too big", - desc_type); - return; - } dvb_desc_init_func init = dvb_descriptors[desc_type].init; if (!init) { @@ -133,21 +138,16 @@ 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; } - current = calloc(1, size); + current = malloc(size); if (!current) { 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;