Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp2333237ybz; Thu, 23 Apr 2020 16:12:25 -0700 (PDT) X-Google-Smtp-Source: APiQypJZVcIozHdMJjg3alQFVAkuCAVtgvs3PEslZOxn2y1Bgy1TPT6ZA/kOAQ1HRMavC3V+ofTo X-Received: by 2002:a50:e40d:: with SMTP id d13mr4652111edm.122.1587683545143; Thu, 23 Apr 2020 16:12:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587683545; cv=none; d=google.com; s=arc-20160816; b=0Py1S/7qiQMw8RVvjflPlerpK8wGUSVMr3qPlV95r5Mpm4X2AQBVQqFNdWHpVb6PyE QR6/Nm/X62qIALl15WHuUDEED/yxRT7bJfbBF8gbjjrR7Eqo3QvzTl8CxB9KZLCbU/QU 0f7OYV0zdKtP3rn2v23BApWJcnM8x2+jH2lb1YpvfLyIZaWnn034fry9NdvgU/fvBE7A MRLA1p2dURBGyL31aqbd96unmXfAyfDxrLPLEM0SRGL5F54Fx3eRzRA/qZmHnFN4VouW EmyB+jNTbrhwknmRQmS7QdxojNZx8NhQmzr62k73ZT6PzIdRHu+IC8lnsdhUf/yoOLSu UAEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=GcRuWvjD7lexpN17ETyeLwiZ7G2mc3jdp2J4whNKKIM=; b=igSRqR0NPZm7aX+dB8m1XcTN74tcTc44xkHl/8kshfSmGHYmQLOrdZumd2tod+8Hq7 Ddgnr6UiBa5C45vcHRGWHVbuJJBms4kCzNznHx5/mChhscsnsiEbgIKqZYJPP7E0rHBj JvG2/PAIpGfOOK5d+XDpHGKiG606P+WGwrbqcTVfSHGwIPztFLlsj6+UkdI3wlNJzynB tlkR4Ay1PfL7jXEKisFCuSDfZVT7ZCMmasE5UZwtNXuS6+NsqvG0F1fOp08xhYmn4YUs 1KsL08HSTP1/EpHm0Mk5nJPYb//5RQox+M4OZzRCEhissUwk7WLIJdyVXmt6fZjDUuwd Rx5A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 8si2153376ejx.280.2020.04.23.16.12.00; Thu, 23 Apr 2020 16:12:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728572AbgDWXJY (ORCPT + 99 others); Thu, 23 Apr 2020 19:09:24 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:50888 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728654AbgDWXG6 (ORCPT ); Thu, 23 Apr 2020 19:06:58 -0400 Received: from [192.168.4.242] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1jRkvk-0004yZ-VE; Fri, 24 Apr 2020 00:06:53 +0100 Received: from ben by deadeye with local (Exim 4.93) (envelope-from ) id 1jRkvh-00E72d-8B; Fri, 24 Apr 2020 00:06:49 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, Denis Kirjanov , "Hans Verkuil" , "Hans de Goede" , "Johan Hovold" , "Mauro Carvalho Chehab" Date: Fri, 24 Apr 2020 00:07:35 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 228/245] media: stv06xx: add missing descriptor sanity checks In-Reply-To: X-SA-Exim-Connect-IP: 192.168.4.242 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.83-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Johan Hovold commit 485b06aadb933190f4bc44e006076bc27a23f205 upstream. Make sure to check that we have two alternate settings and at least one endpoint before accessing the second altsetting structure and dereferencing the endpoint arrays. This specifically avoids dereferencing NULL-pointers or corrupting memory when a device does not have the expected descriptors. Note that the sanity checks in stv06xx_start() and pb0100_start() are not redundant as the driver is mixing looking up altsettings by index and by number, which may not coincide. Fixes: 8668d504d72c ("V4L/DVB (12082): gspca_stv06xx: Add support for st6422 bridge and sensor") Fixes: c0b33bdc5b8d ("[media] gspca-stv06xx: support bandwidth changing") Cc: Hans de Goede Signed-off-by: Johan Hovold Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Ben Hutchings --- drivers/media/usb/gspca/stv06xx/stv06xx.c | 19 ++++++++++++++++++- .../media/usb/gspca/stv06xx/stv06xx_pb0100.c | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) --- a/drivers/media/usb/gspca/stv06xx/stv06xx.c +++ b/drivers/media/usb/gspca/stv06xx/stv06xx.c @@ -293,6 +293,9 @@ static int stv06xx_start(struct gspca_de return -EIO; } + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); err = stv06xx_write_bridge(sd, STV_ISO_SIZE_L, packet_size); if (err < 0) @@ -317,11 +320,21 @@ out: static int stv06xx_isoc_init(struct gspca_dev *gspca_dev) { + struct usb_interface_cache *intfc; struct usb_host_interface *alt; struct sd *sd = (struct sd *) gspca_dev; + intfc = gspca_dev->dev->actconfig->intf_cache[0]; + + if (intfc->num_altsetting < 2) + return -ENODEV; + + alt = &intfc->altsetting[1]; + + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + /* Start isoc bandwidth "negotiation" at max isoc bandwidth */ - alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(sd->sensor->max_packet_size[gspca_dev->curr_mode]); @@ -334,6 +347,10 @@ static int stv06xx_isoc_nego(struct gspc struct usb_host_interface *alt; struct sd *sd = (struct sd *) gspca_dev; + /* + * Existence of altsetting and endpoint was verified in + * stv06xx_isoc_init() + */ alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); min_packet_size = sd->sensor->min_packet_size[gspca_dev->curr_mode]; --- a/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c +++ b/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c @@ -198,6 +198,10 @@ static int pb0100_start(struct sd *sd) alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt); if (!alt) return -ENODEV; + + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); /* If we don't have enough bandwidth use a lower framerate */