Received: by 10.223.185.116 with SMTP id b49csp4188505wrg; Mon, 26 Feb 2018 12:50:51 -0800 (PST) X-Google-Smtp-Source: AH8x2246d+n2hTe6CQoinS7GEIyZPB1GPcjpO4WPg7FCrzSuhieaboisDhGf6ZD+xD4CEMY4P0Wr X-Received: by 2002:a17:902:8491:: with SMTP id c17-v6mr11856367plo.105.1519678251512; Mon, 26 Feb 2018 12:50:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519678251; cv=none; d=google.com; s=arc-20160816; b=wslzxAfmvb6kKam3aP9tb63fa+cFDR8uVbiv6d1n/RWiAKzafbFGq43mG8eG20pV3J lbzZNPJqAYgRrLVZ5SSNrLiYdzz6DrqkfFVj6wZ/8meO+4tPYrSsfE+fO9txnu7P7OSu Rz6JWxlukojU8cICGq++KsIgVOag8A1U1pzjHXTo4Tr3j9fR6dKAO1+dfVjm/fFwbl/6 /Dt+zH98FEkKNN5aby2DPGXbAkupE/J078SHI7uCQLe7OFtE3yyIPz6P4PogHgfKkpZu 5UHFyzJhfqhpHLBnDGY4BQHl72GkaJkxpY/vBVlEthaupwz4PSzNmx2WMUVmhwv/w3Lk XsDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=fj/+KfKwHWCDvv437N+KEf0PZe+IG+OAWB8VTzrFa6I=; b=OQPbMmvN/ql1Kl2fCZGe4dms74dPIqIyRxUYTXrxZNmHs7P0Ku+6g0Y9zhVlyMEacb rKlYKSXg7JN+29SM7ksaca2BRAzPm0eAtE3sVJkhwFNHB4Ip/w155H0EkGvvjtxKB5iL Csq62M+DjfgIRAYEF8v4eMevjRhVk6TZp3sNeNzNavrdJivMxv8spOttyGg7ZJx2Vq3J kijMVK5w+l4WRYCXeX8FnB9uKjAvCK/rBHKcrV4PiqjOH4ep7zaKQQpPHeAGcrkXnmGG tQTQip7cAwjQLPlftWCLuyILl0+Kdd9mQ4aQSQpn8gMZ/vD4JMkJvFfxorUd3W/mqPAE ZNVQ== ARC-Authentication-Results: i=1; mx.google.com; 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 i2si5946293pgf.145.2018.02.26.12.50.35; Mon, 26 Feb 2018 12:50:51 -0800 (PST) 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; 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 S1753081AbeBZUZE (ORCPT + 99 others); Mon, 26 Feb 2018 15:25:04 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:35334 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753061AbeBZUZB (ORCPT ); Mon, 26 Feb 2018 15:25:01 -0500 Received: from localhost (clnet-b04-243.ikbnet.co.at [83.175.124.243]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id AA57CFD3; Mon, 26 Feb 2018 20:25:00 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jack Pham , Felipe Balbi Subject: [PATCH 4.14 44/54] usb: gadget: f_fs: Use config_ep_by_speed() Date: Mon, 26 Feb 2018 21:22:21 +0100 Message-Id: <20180226202146.586025196@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180226202144.375869933@linuxfoundation.org> References: <20180226202144.375869933@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Jack Pham commit 675272d092e4a5570bace92593776f7348daf4c5 upstream. In commit 2bfa0719ac2a ("usb: gadget: function: f_fs: pass companion descriptor along") there is a pointer arithmetic bug where the comp_desc is obtained as follows: comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + USB_DT_ENDPOINT_SIZE); Since ds is a pointer to usb_endpoint_descriptor, adding 7 to it ends up going out of bounds (7 * sizeof(struct usb_endpoint_descriptor), which is actually 7*9 bytes) past the SS descriptor. As a result the maxburst value will be read incorrectly, and the UDC driver will also get a garbage comp_desc (assuming it uses it). Since Felipe wrote, "Eventually, f_fs.c should be converted to use config_ep_by_speed() like all other functions, though", let's finally do it. This allows the other usb_ep fields to be properly populated, such as maxpacket and mult. It also eliminates the awkward speed-based descriptor lookup since config_ep_by_speed() does that already using the ones found in struct usb_function. Fixes: 2bfa0719ac2a ("usb: gadget: function: f_fs: pass companion descriptor along") Cc: stable@vger.kernel.org Signed-off-by: Jack Pham Signed-off-by: Felipe Balbi Signed-off-by: Greg Kroah-Hartman --- drivers/usb/gadget/function/f_fs.c | 38 ++++++------------------------------- 1 file changed, 7 insertions(+), 31 deletions(-) --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -1856,44 +1856,20 @@ static int ffs_func_eps_enable(struct ff spin_lock_irqsave(&func->ffs->eps_lock, flags); while(count--) { - struct usb_endpoint_descriptor *ds; - struct usb_ss_ep_comp_descriptor *comp_desc = NULL; - int needs_comp_desc = false; - int desc_idx; - - if (ffs->gadget->speed == USB_SPEED_SUPER) { - desc_idx = 2; - needs_comp_desc = true; - } else if (ffs->gadget->speed == USB_SPEED_HIGH) - desc_idx = 1; - else - desc_idx = 0; - - /* fall-back to lower speed if desc missing for current speed */ - do { - ds = ep->descs[desc_idx]; - } while (!ds && --desc_idx >= 0); - - if (!ds) { - ret = -EINVAL; - break; - } - ep->ep->driver_data = ep; - ep->ep->desc = ds; - if (needs_comp_desc) { - comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + - USB_DT_ENDPOINT_SIZE); - ep->ep->maxburst = comp_desc->bMaxBurst + 1; - ep->ep->comp_desc = comp_desc; + ret = config_ep_by_speed(func->gadget, &func->function, ep->ep); + if (ret) { + pr_err("%s: config_ep_by_speed(%s) returned %d\n", + __func__, ep->ep->name, ret); + break; } ret = usb_ep_enable(ep->ep); if (likely(!ret)) { epfile->ep = ep; - epfile->in = usb_endpoint_dir_in(ds); - epfile->isoc = usb_endpoint_xfer_isoc(ds); + epfile->in = usb_endpoint_dir_in(ep->ep->desc); + epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc); } else { break; }