Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp347660ybi; Fri, 7 Jun 2019 09:01:47 -0700 (PDT) X-Google-Smtp-Source: APXvYqz8okhCWESabR+cyTmAdN1No4TU4DKkqrZDJ8ulHFXPda6IsX6QMt3J79W7OaWgkY0olWtN X-Received: by 2002:a17:902:1c9:: with SMTP id b67mr8958875plb.333.1559923307343; Fri, 07 Jun 2019 09:01:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559923307; cv=none; d=google.com; s=arc-20160816; b=qxv5aGi4mE5td4eiJ1RbD7ZxM15p0drFbASTK/Mj9FAFwq0UbAfexZbW5aSRf1irJa iLcXBxRksnzVXQKSNF5uDHXJKzX2Y+nMHCWMFAtFYyshykJCmpe0eZYDzNL8EFTajmWI UKN8xE4W0E33FuIfFz2O1idXuFJIBP3jtal0kF5Zwh8Qu1HD9iJKqPqHZkpdORmeoTNC hZDF0jo9eEydZxPR8CpAs3qBNBbINW6VJKMO5W5k39dwxipm3Qp6mNKYT6zFrC9Mefx5 cGYTpR05pzjCx1n4h+A9Wuru9nSSfUdQAE1EYxmV1QlT4FZNPxhyRCsJvQnP2/5+DTlx Y9vQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=uCDtrx4N8Q/LforB3ehNzkyyKYSdtKFCvh6ydyFOGkU=; b=0PaBVYIe8hqLixN1zwmyMF+QoipTaxw2WY5zIlRnJfknfpsDSju8WvEgvPkiH1Er9X mL+mneKMOsTO4ZlSm43py8ho9C+fYGgNHBCiS0XhKSKz8aZ14qMk4gVPw+mVDjKGjMZY NRlgLqXorjf/8XyAVwzOx2wKonNnlrVdLJKlIRTNgG8zTi4N67m8ho6fO8+/5BwDXKYu u990siBs25AUmPzo+S+9oHKk4/QH1g/DufHqLPgT1jFejLm/Q6zC7JQly+0esE8FB+PZ 8bOr9FtkbiwnbJqqgfEjUB0kAtGcvG6prBTDv/hpqLuCom2dCByMXDecvlz6vWcoEhh7 KV0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gPMdvX8R; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t4si2099733pgu.316.2019.06.07.09.01.28; Fri, 07 Jun 2019 09:01:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gPMdvX8R; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730357AbfFGPlj (ORCPT + 99 others); Fri, 7 Jun 2019 11:41:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:51640 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730344AbfFGPli (ORCPT ); Fri, 7 Jun 2019 11:41:38 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DCD98212F5; Fri, 7 Jun 2019 15:41:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559922097; bh=9pQV96GQ5yaR3ppCHishu8Pql1cXDN8GY/jBzvaDq3U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gPMdvX8RqXbLg7DyNMPu794UiNCwdzLf2/gx7W4RdryNRrTu1YvTNkDsZJ8v8KtfV K9uFn+NZFuIyaKUHFaZcQJIeZ8z2GRP+FJRZnneeb/ZUBzfQ557my/5V/47dTU97wq LxSaibmpvFyRhXDTT4QpZrRSDDc4fvo7BwuQLT1Y= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alan Stern , Johan Hovold , syzbot+53f029db71c19a47325a@syzkaller.appspotmail.com Subject: [PATCH 4.14 34/69] media: usb: siano: Fix general protection fault in smsusb Date: Fri, 7 Jun 2019 17:39:15 +0200 Message-Id: <20190607153852.588533064@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190607153848.271562617@linuxfoundation.org> References: <20190607153848.271562617@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alan Stern commit 31e0456de5be379b10fea0fa94a681057114a96e upstream. The syzkaller USB fuzzer found a general-protection-fault bug in the smsusb part of the Siano DVB driver. The fault occurs during probe because the driver assumes without checking that the device has both IN and OUT endpoints and the IN endpoint is ep1. By slightly rearranging the driver's initialization code, we can make the appropriate checks early on and thus avoid the problem. If the expected endpoints aren't present, the new code safely returns -ENODEV from the probe routine. Signed-off-by: Alan Stern Reported-and-tested-by: syzbot+53f029db71c19a47325a@syzkaller.appspotmail.com CC: Reviewed-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/media/usb/siano/smsusb.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) --- a/drivers/media/usb/siano/smsusb.c +++ b/drivers/media/usb/siano/smsusb.c @@ -402,6 +402,7 @@ static int smsusb_init_device(struct usb struct smsusb_device_t *dev; void *mdev; int i, rc; + int in_maxp; /* create device object */ dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL); @@ -413,6 +414,24 @@ static int smsusb_init_device(struct usb dev->udev = interface_to_usbdev(intf); dev->state = SMSUSB_DISCONNECTED; + for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { + struct usb_endpoint_descriptor *desc = + &intf->cur_altsetting->endpoint[i].desc; + + if (desc->bEndpointAddress & USB_DIR_IN) { + dev->in_ep = desc->bEndpointAddress; + in_maxp = usb_endpoint_maxp(desc); + } else { + dev->out_ep = desc->bEndpointAddress; + } + } + + pr_debug("in_ep = %02x, out_ep = %02x\n", dev->in_ep, dev->out_ep); + if (!dev->in_ep || !dev->out_ep) { /* Missing endpoints? */ + smsusb_term_device(intf); + return -ENODEV; + } + params.device_type = sms_get_board(board_id)->type; switch (params.device_type) { @@ -427,24 +446,12 @@ static int smsusb_init_device(struct usb /* fall-thru */ default: dev->buffer_size = USB2_BUFFER_SIZE; - dev->response_alignment = - le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) - - sizeof(struct sms_msg_hdr); + dev->response_alignment = in_maxp - sizeof(struct sms_msg_hdr); params.flags |= SMS_DEVICE_FAMILY2; break; } - for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { - if (intf->cur_altsetting->endpoint[i].desc. bEndpointAddress & USB_DIR_IN) - dev->in_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress; - else - dev->out_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress; - } - - pr_debug("in_ep = %02x, out_ep = %02x\n", - dev->in_ep, dev->out_ep); - params.device = &dev->udev->dev; params.buffer_size = dev->buffer_size; params.num_buffers = MAX_BUFFERS;