Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp2934967ybk; Mon, 18 May 2020 11:29:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw+CNvL7NskjGh7GkYulw+6x9eEucKCYdXc5e+y9RRq3UG0E8e9ytNKRMd7J5OEXBmoh2RL X-Received: by 2002:a17:906:860a:: with SMTP id o10mr16803645ejx.250.1589826575066; Mon, 18 May 2020 11:29:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589826575; cv=none; d=google.com; s=arc-20160816; b=TfqeztDOMxx2b6kXGWhrHZukdi92V2Qs4mMjGJjwEegg+hGjPs0bsd+F9flZJ3ixSK xuiOhVLn7p0zzAG24XMrOOR0Ym0PktNOhjQiS5fi/6XNFo4SbIQlF3cr982ZVQp2M8Tu c69MGMlB4kvKsPAgcfBGmXo6x8kU248qBeWgljm42LF/OEN2bjWoNxXY8+SGLd66kOvK BSIDGZMFrtDDFR/Rb+E4tYRXTO6D+qGb2ajjxiUs+EYiVFdjetMikBuyAJ/+pAJau7F4 WVOuVfefNqV+mTLPed3WRanYoiKDMzkOoADGzL04tL0WgZyrtCXxluwtVnjmW0Ayn6UO hOrw== 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=P+qFcSFS8e+QdifV3l+W9riWG6H+cXOMv7P5SgGbthQ=; b=SVJQpncK2+oIRyO5AK55G93P4MydvOyhFo1uJpEJrclmWyk3wiS3bIgeHrIBVfzwGs 5nKFOTFG7v1nfC6LO3sxU1lj0pKtUOEPLwdEnmTM/irkaJV4l+ev1sdtzUC8miwyot9S gUCNBTEe29nc9BfaNEWbfBa0A6oEM06vQppMitWuUo5LRRexvikphfszVY3wzZTIvWdf JA0EzzwKQv41o6nJ0+BwHKJxumBi1pzLCjJPJX6bj1opsQRjfKN99PZPbIYYOEUHYFQ9 RTcAYANCK9qUFMSrapJzpvg9cKydbuaLzKIHfoBvmfI2d9sqgF8wdojiAqXuamAfzWGu JP4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="HMw/OqIn"; 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 m6si1148191edv.283.2020.05.18.11.29.10; Mon, 18 May 2020 11:29:35 -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; dkim=pass header.i=@kernel.org header.s=default header.b="HMw/OqIn"; 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 S1730398AbgERS1A (ORCPT + 99 others); Mon, 18 May 2020 14:27:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:43368 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729813AbgERRov (ORCPT ); Mon, 18 May 2020 13:44:51 -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 4759520715; Mon, 18 May 2020 17:44:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1589823890; bh=kdS5j2A6PO8m645JzTY/Zwhoyz4W+w8yLimNgWncQYQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HMw/OqInXJc8oVmp1iaPuNHBmwZ4dirHSeUKL4cTTsfZlGfkrdQzCUvCjsO0qH8mO P7SdlOrbspS7CNJxwvc2gla20J4LaYO777x5gpbhf5nLwD3Dx1wyL5OAtXvnitHulO 9io24h0JOaM62V4PfDavtlc0qNeyZi7YX84IiIpE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sriharsha Allenki , Mathias Nyman Subject: [PATCH 4.9 78/90] usb: xhci: Fix NULL pointer dereference when enqueuing trbs from urb sg list Date: Mon, 18 May 2020 19:36:56 +0200 Message-Id: <20200518173507.126798691@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518173450.930655662@linuxfoundation.org> References: <20200518173450.930655662@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: Sriharsha Allenki commit 3c6f8cb92c9178fc0c66b580ea3df1fa3ac1155a upstream. On platforms with IOMMU enabled, multiple SGs can be coalesced into one by the IOMMU driver. In that case the SG list processing as part of the completion of a urb on a bulk endpoint can result into a NULL pointer dereference with the below stack dump. <6> Unable to handle kernel NULL pointer dereference at virtual address 0000000c <6> pgd = c0004000 <6> [0000000c] *pgd=00000000 <6> Internal error: Oops: 5 [#1] PREEMPT SMP ARM <2> PC is at xhci_queue_bulk_tx+0x454/0x80c <2> LR is at xhci_queue_bulk_tx+0x44c/0x80c <2> pc : [] lr : [] psr: 000000d3 <2> sp : ca337c80 ip : 00000000 fp : ffffffff <2> r10: 00000000 r9 : 50037000 r8 : 00004000 <2> r7 : 00000000 r6 : 00004000 r5 : 00000000 r4 : 00000000 <2> r3 : 00000000 r2 : 00000082 r1 : c2c1a200 r0 : 00000000 <2> Flags: nzcv IRQs off FIQs off Mode SVC_32 ISA ARM Segment none <2> Control: 10c0383d Table: b412c06a DAC: 00000051 <6> Process usb-storage (pid: 5961, stack limit = 0xca336210) <2> [] (xhci_queue_bulk_tx) <2> [] (xhci_urb_enqueue) <2> [] (usb_hcd_submit_urb) <2> [] (usb_sg_wait) <2> [] (usb_stor_bulk_transfer_sglist) <2> [] (usb_stor_bulk_srb) <2> [] (usb_stor_Bulk_transport) <2> [] (usb_stor_invoke_transport) <2> [] (usb_stor_control_thread) <2> [] (kthread) The above NULL pointer dereference is the result of block_len and the sent_len set to zero after the first SG of the list when IOMMU driver is enabled. Because of this the loop of processing the SGs has run more than num_sgs which resulted in a sg_next on the last SG of the list which has SG_END set. Fix this by check for the sg before any attributes of the sg are accessed. [modified reason for null pointer dereference in commit message subject -Mathias] Fixes: f9c589e142d04 ("xhci: TD-fragment, align the unsplittable case with a bounce buffer") Cc: stable@vger.kernel.org Signed-off-by: Sriharsha Allenki Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20200514110432.25564-2-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-ring.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -3347,8 +3347,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd * /* New sg entry */ --num_sgs; sent_len -= block_len; - if (num_sgs != 0) { - sg = sg_next(sg); + sg = sg_next(sg); + if (num_sgs != 0 && sg) { block_len = sg_dma_len(sg); addr = (u64) sg_dma_address(sg); addr += sent_len;