From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AH8x2253EM/i3Fu0jrynPKLqZQkDdxLibOrpyFsOpXReC47+a4Gje/WvfnaNkA3vY9Jvp42NEKYe ARC-Seal: i=1; a=rsa-sha256; t=1517256870; cv=none; d=google.com; s=arc-20160816; b=eNPpu0vFZA/dho/nEn8Kr0PyTcBN1uzdMO4vF6hep5IwVh0cDsIbJ6RE0nRMifUsf3 oJfaefTbaSDkT4YBLXisDIEKJimVWoVm6Sgj9l+Rs97/hb1ncYHSY0kJ/3NVu/vV3cRg JB/+5fnrciJycqs+ZXDcdRLvepScjb/AUzOeOUbKWcyVLtvh+pjYMx/RMtt5OcDyV64B 6PHCEDMqOXaNnQTDNnKKgpsk2Q3ZUrMbRJaVoYSfy8BIQOfBj+w1r3Xxaj8OuF3vSOOK 5narLX+la8vEHH6nkeCVEmQm8VpVft/OIMpMFJMlecVd3cS/zu/j0LMSNQB6H0JTxmd4 VFZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:user-agent:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=6FaJkkivCUtsG4tKeEEFor5nxWKD/rdPps0fMi5c8+o=; b=XlH/B/gyyHy13BrPl7utsFHFxG0xz4GYObEBcrB9nojA7ljFY2HPqRtTE8v4r1EzQM JwRJbEbH8/MvXHXe72Jhjtg++qmcwwizZGQnKeDyWEbVKev7skNrUvfqhA3U9r1lrgQ0 e+Tz3Vrmll91Zg+7SCRLw3KpoijePQ5ff9c/xRpBflAEOVFwG1PShiP4rC7jZGKxJ86G eTXmh9cGg/s1ryZW2qQsK6h2U4LqBgVpeDkk25fidlnggczMwromHj+/Y3vswlWgQrQR f0TG1043xjrspeaOg/mV02ZGnxNp4Gdo/6llktCMDvfUs+o9zSqNVHTnoQjqO6MRBZr8 lD0Q== ARC-Authentication-Results: i=1; mx.google.com; spf=softfail (google.com: domain of transitioning gregkh@linuxfoundation.org does not designate 90.92.71.90 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning gregkh@linuxfoundation.org does not designate 90.92.71.90 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Secunia Research , Shuah Khan Subject: [PATCH 4.4 50/74] usbip: fix stub_rx: get_pipe() to validate endpoint number Date: Mon, 29 Jan 2018 13:56:55 +0100 Message-Id: <20180129123849.843147951@linuxfoundation.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180129123847.507563674@linuxfoundation.org> References: <20180129123847.507563674@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-LABELS: =?utf-8?b?IlxcU2VudCI=?= X-GMAIL-THRID: =?utf-8?q?1590959140193070550?= X-GMAIL-MSGID: =?utf-8?q?1590959140193070550?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Shuah Khan commit 635f545a7e8be7596b9b2b6a43cab6bbd5a88e43 upstream. get_pipe() routine doesn't validate the input endpoint number and uses to reference ep_in and ep_out arrays. Invalid endpoint number can trigger BUG(). Range check the epnum and returning error instead of calling BUG(). Change caller stub_recv_cmd_submit() to handle the get_pipe() error return. Reported-by: Secunia Research Signed-off-by: Shuah Khan Signed-off-by: Greg Kroah-Hartman --- drivers/usb/usbip/stub_rx.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) --- a/drivers/usb/usbip/stub_rx.c +++ b/drivers/usb/usbip/stub_rx.c @@ -344,15 +344,15 @@ static int get_pipe(struct stub_device * struct usb_host_endpoint *ep; struct usb_endpoint_descriptor *epd = NULL; + if (epnum < 0 || epnum > 15) + goto err_ret; + if (dir == USBIP_DIR_IN) ep = udev->ep_in[epnum & 0x7f]; else ep = udev->ep_out[epnum & 0x7f]; - if (!ep) { - dev_err(&sdev->interface->dev, "no such endpoint?, %d\n", - epnum); - BUG(); - } + if (!ep) + goto err_ret; epd = &ep->desc; if (usb_endpoint_xfer_control(epd)) { @@ -383,9 +383,10 @@ static int get_pipe(struct stub_device * return usb_rcvisocpipe(udev, epnum); } +err_ret: /* NOT REACHED */ - dev_err(&sdev->interface->dev, "get pipe, epnum %d\n", epnum); - return 0; + dev_err(&sdev->udev->dev, "get pipe() invalid epnum %d\n", epnum); + return -1; } static void masking_bogus_flags(struct urb *urb) @@ -451,6 +452,9 @@ static void stub_recv_cmd_submit(struct struct usb_device *udev = sdev->udev; int pipe = get_pipe(sdev, pdu->base.ep, pdu->base.direction); + if (pipe == -1) + return; + priv = stub_priv_alloc(sdev, pdu); if (!priv) return;