Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3057099yba; Sat, 18 May 2019 08:27:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqzfFRihYlruduObq2nkni+MITrVvtIJDfoFJNIX6hxR+R0/6tfAjj5w/bx8bXDrDjmeMaEu X-Received: by 2002:a17:902:2bca:: with SMTP id l68mr62089371plb.301.1558193257337; Sat, 18 May 2019 08:27:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558193257; cv=none; d=google.com; s=arc-20160816; b=c0ZxeZDd2rNHjh5XEGTi8fHaCpFGHq0U55UUqpb07San26M3LSTN1G2g7vwt7V2rs7 tTXpab2WfTzkYzx4jSoGznAdUL17t/vb+VN8XepuBGtlv7rYl59quFUsrI5bIDgJ8it1 P55Fo0z9z+eLpi+QEtUeV4i6rfPhbpAmI7YORxsIuQddPliybnpKLbzChPL1HdQOtCfq okmAeKfKKoS23WZhN5EDbfcGb65RmZ8Yggn6BaXQLnssxPBoFp1uphAKhlBJ5aui5x8I fEB3cLgdbJAHEqBgvXwqdIzLKiaRLjBBxyhvbk45Pi/aVsHn2CjSrbOcbP3qYQcnzh4P nrTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:in-reply-to :subject:cc:to:from:date; bh=mUBQvsfRDJIATBlNQz5HZr63xGvocvQRq/aO/fSuFtA=; b=m9alLjQwEPAsyngVy3JDdKmDUwkLfcxEz0tkCmCDDSePyO4nglD/Uq1CCPTzXlGCUr uusRTwccw1aob75qpPHJiCV5rkk5WkToUcaK2JzJ++31mRpHNkb0XzNHHboiFtQSJakl L3BrWgtqL5VJx/6TkPH7RY5sb91w6W1oqxt2k7mE/w8Yf/GJvcTUMScUqB/K+RBhjYED tD9iEMl0PnCPqp4znncm0fGHM9Gq0dOTl9X6iwSUS/Aqby0IN+yThvI83PL67YU1ilPK WDnmC164UpJFHsT0hVrRx3R/4xs2Kuh7QlCufuGt5dQURwFFSwbVd7S4uRpUuPbliUN/ dVyA== 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 187si11917804pgj.149.2019.05.18.08.27.22; Sat, 18 May 2019 08:27:37 -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; 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 S1729742AbfERPNk (ORCPT + 99 others); Sat, 18 May 2019 11:13:40 -0400 Received: from netrider.rowland.org ([192.131.102.5]:59571 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1729147AbfERPNk (ORCPT ); Sat, 18 May 2019 11:13:40 -0400 Received: (qmail 8434 invoked by uid 500); 18 May 2019 11:13:39 -0400 Received: from localhost (sendmail-bs@127.0.0.1) by localhost with SMTP; 18 May 2019 11:13:39 -0400 Date: Sat, 18 May 2019 11:13:39 -0400 (EDT) From: Alan Stern X-X-Sender: stern@netrider.rowland.org To: syzbot cc: andreyknvl@google.com, , , , , Kernel development list , USB list , , , Oliver Neukum , Subject: Re: KASAN: use-after-free Read in p54u_load_firmware_cb In-Reply-To: <00000000000009fcff05891bae0a@google.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 17 May 2019, syzbot wrote: > Hello, > > syzbot tried to test the proposed patch but build/boot failed: Drat. Mistake in the patch. Let's try again. Incidentally, as far as I can tell there's no point in having the usb_get_dev() in p54u_probe() and usb_put_dev() in p54u_disconnect(). The device structure is guaranteed not to be deallocated while a driver is bound to any of its interfaces, so taking an extra reference won't make any difference. On the other hand, I do see some problems in the firmware-load callback. First, it calls device_release_driver() without first checking that the interface is still bound to the p54u driver. Second, it shouldn't call device_release_driver() at all -- it should call usb_driver_release_interface(). It doesn't want to unbind the USB device's driver; it wants to unbind the interface's driver. And third, to do this it needs to acquire udev's device lock, not the lock for udev's parent. Alan Stern #syz test: https://github.com/google/kasan.git usb-fuzzer drivers/net/wireless/intersil/p54/p54usb.c | 3 +++ 1 file changed, 3 insertions(+) Index: usb-devel/drivers/net/wireless/intersil/p54/p54usb.c =================================================================== --- usb-devel.orig/drivers/net/wireless/intersil/p54/p54usb.c +++ usb-devel/drivers/net/wireless/intersil/p54/p54usb.c @@ -923,6 +923,7 @@ static void p54u_load_firmware_cb(const struct usb_device *udev = priv->udev; int err; + pr_info("%s: priv->udev = %px\n", __func__, udev); complete(&priv->fw_wait_load); if (firmware) { priv->fw = firmware; @@ -969,6 +970,8 @@ static int p54u_load_firmware(struct iee if (i < 0) return i; + dev_info(&udev->dev, "%s: udev @ %px, dev.parent @ %px\n", + __func__, udev, &udev->dev.parent); dev_info(&priv->udev->dev, "Loading firmware file %s\n", p54u_fwlist[i].fw);