Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1990039imu; Fri, 14 Dec 2018 04:09:41 -0800 (PST) X-Google-Smtp-Source: AFSGD/Uj5m9zFS+dpbk99kT474XbvR+m0BUT0W0jGt8g6IvGxoPSWjPtq9c4124rSxqbXyozpSJN X-Received: by 2002:a62:178f:: with SMTP id 137mr2552717pfx.226.1544789381284; Fri, 14 Dec 2018 04:09:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544789381; cv=none; d=google.com; s=arc-20160816; b=LhsY6/IohT2MvkrKOTcKK/SRZkmgYigu8SZ4vZZTXMcPB9FWT55tbkwKcf92FUCKvb Q+mPjFhNJ9YCAacJ++9TTyBeVMrtR4rA6wh5J/k58OQK9P/6Ou9oUhOhg35IlaL8O5Go pvyU8bk3cX3fD3ze3AFn0UPr88rNSPQYm1nYN0KSwNDmG3F3ej4X0NFekQeHpZKbSw4p T6uu3QXqYhJziBeaqMeNOtiI69PwskzwzqIDXdvW1N2bT9p/p7tku+I4QQIWa+I+OGOJ GvKaNcs+Apbr8YFOPeVOPmeD8ZMewHtGEBSeHb+ytDJlLhZPDeZ5JrriiPtusWAUHYPm Es6Q== 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=E3sPjTjzbWMMG9BY8Q1eA8MjTesyi9X34F+nevITN3g=; b=PLEwJN2oOSnY6F6OQ4EswxnDxKtVvofnmV/qgrfCAXRLLwBBqz/PuGWUOssGfnWHzL bxVM2feaUJyp5WjWvhyg2jIeSKsHBguHRpbqmTvZPbfTrFHVxV1DlkkMTKPSUJy1O12I T7CBrpOzgeECNJ4OIPFHtf3zw/7HemMHfaGdww3KoG2D9a99y6swFSNuaQDoFn382VB7 YyMRVZ13tziemJK8DZjj6hn8NCuQC+5UXrExjDoclw2ObDV471Pnzt2wAU6TkNqitSB5 qNGX5EkKChhnwGcRXfIG2iUMwEkWi8LlXBXgr/BgUgOKgOHq+c4mkZHGa0/C2oBKOTpP jeVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Dt5Vtw0O; 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 a35si3906698pla.226.2018.12.14.04.09.21; Fri, 14 Dec 2018 04:09:41 -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; dkim=pass header.i=@kernel.org header.s=default header.b=Dt5Vtw0O; 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 S1730041AbeLNMGV (ORCPT + 99 others); Fri, 14 Dec 2018 07:06:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:51268 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730884AbeLNMGR (ORCPT ); Fri, 14 Dec 2018 07:06:17 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.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 62D0521479; Fri, 14 Dec 2018 12:06:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1544789176; bh=86byxqzQxm6xrR1o2XIG24tT8A1yC0XgMGhzna46jjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dt5Vtw0O1knZMi+q1TCThdkLAlHfnhXMD4bpPWfW0ZtTQgBiOGeiSbrs62uX8Sb9v 6REMZmZSt675JFai+thXMKYPpji0vPQ5AB49IIDM6HvRQkT4lmIIHmpE3/7yLzyMYQ n5vUCaks+VfVh/zkvlJ1PSbhRMlA+4iOTELDbINQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Marek Szyprowski , Felipe Balbi , Sasha Levin Subject: [PATCH 4.19 101/142] usb: gadget: u_ether: fix unsafe list iteration Date: Fri, 14 Dec 2018 12:59:46 +0100 Message-Id: <20181214115751.097067904@linuxfoundation.org> X-Mailer: git-send-email 2.20.0 In-Reply-To: <20181214115747.053633987@linuxfoundation.org> References: <20181214115747.053633987@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit c9287fa657b3328b4549c0ab39ea7f197a3d6a50 ] list_for_each_entry_safe() is not safe for deleting entries from the list if the spin lock, which protects it, is released and reacquired during the list iteration. Fix this issue by replacing this construction with a simple check if list is empty and removing the first entry in each iteration. This is almost equivalent to a revert of the commit mentioned in the Fixes: tag. This patch fixes following issue: --->8--- Unable to handle kernel NULL pointer dereference at virtual address 00000104 pgd = (ptrval) [00000104] *pgd=00000000 Internal error: Oops: 817 [#1] PREEMPT SMP ARM Modules linked in: CPU: 1 PID: 84 Comm: kworker/1:1 Not tainted 4.20.0-rc2-next-20181114-00009-g8266b35ec404 #1061 Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) Workqueue: events eth_work PC is at rx_fill+0x60/0xac LR is at _raw_spin_lock_irqsave+0x50/0x5c pc : [] lr : [] psr: 80000093 sp : ee7fbee8 ip : 00000100 fp : 00000000 r10: 006000c0 r9 : c10b0ab0 r8 : ee7eb5c0 r7 : ee7eb614 r6 : ee7eb5ec r5 : 000000dc r4 : ee12ac00 r3 : ee12ac24 r2 : 00000200 r1 : 60000013 r0 : ee7eb5ec Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none Control: 10c5387d Table: 6d5dc04a DAC: 00000051 Process kworker/1:1 (pid: 84, stack limit = 0x(ptrval)) Stack: (0xee7fbee8 to 0xee7fc000) ... [] (rx_fill) from [] (process_one_work+0x200/0x738) [] (process_one_work) from [] (worker_thread+0x2c/0x4c8) [] (worker_thread) from [] (kthread+0x128/0x164) [] (kthread) from [] (ret_from_fork+0x14/0x20) Exception stack(0xee7fbfb0 to 0xee7fbff8) ... ---[ end trace 64480bc835eba7d6 ]--- Fixes: fea14e68ff5e ("usb: gadget: u_ether: use better list accessors") Signed-off-by: Marek Szyprowski Signed-off-by: Felipe Balbi Signed-off-by: Sasha Levin --- drivers/usb/gadget/function/u_ether.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 1000d864929c..0f026d445e31 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -401,12 +401,12 @@ static int alloc_requests(struct eth_dev *dev, struct gether *link, unsigned n) static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) { struct usb_request *req; - struct usb_request *tmp; unsigned long flags; /* fill unused rxq slots with some skb */ spin_lock_irqsave(&dev->req_lock, flags); - list_for_each_entry_safe(req, tmp, &dev->rx_reqs, list) { + while (!list_empty(&dev->rx_reqs)) { + req = list_first_entry(&dev->rx_reqs, struct usb_request, list); list_del_init(&req->list); spin_unlock_irqrestore(&dev->req_lock, flags); @@ -1125,7 +1125,6 @@ void gether_disconnect(struct gether *link) { struct eth_dev *dev = link->ioport; struct usb_request *req; - struct usb_request *tmp; WARN_ON(!dev); if (!dev) @@ -1142,7 +1141,8 @@ void gether_disconnect(struct gether *link) */ usb_ep_disable(link->in_ep); spin_lock(&dev->req_lock); - list_for_each_entry_safe(req, tmp, &dev->tx_reqs, list) { + while (!list_empty(&dev->tx_reqs)) { + req = list_first_entry(&dev->tx_reqs, struct usb_request, list); list_del(&req->list); spin_unlock(&dev->req_lock); @@ -1154,7 +1154,8 @@ void gether_disconnect(struct gether *link) usb_ep_disable(link->out_ep); spin_lock(&dev->req_lock); - list_for_each_entry_safe(req, tmp, &dev->rx_reqs, list) { + while (!list_empty(&dev->rx_reqs)) { + req = list_first_entry(&dev->rx_reqs, struct usb_request, list); list_del(&req->list); spin_unlock(&dev->req_lock); -- 2.19.1