Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4746967imu; Sat, 19 Jan 2019 17:44:17 -0800 (PST) X-Google-Smtp-Source: ALg8bN6FzJIxegyd5beM6BLA5rmrO9W4WKKoZWS7pE+Vg3UZqCLIT4RwmKDVoe12eb7Ma0zYYHMi X-Received: by 2002:a17:902:2a0a:: with SMTP id i10mr24256966plb.323.1547948657387; Sat, 19 Jan 2019 17:44:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547948657; cv=none; d=google.com; s=arc-20160816; b=LmxM0aOisDIrk5vGGKYD+GyBV9Nby4sUEy2vSISaZ2t55djKcFi0LtCDui0CVvR/Xe 7Wcm08Qd7L6j/epMmtM7g133YGSFKD1eQkHEXSEH5AOfTXnaZlVwbYRFCJtjphh+W6DV cBaFAEwgFPGYEOTgIndIch0/bxa8YSGbi9IaoLWgARZ8SGyKRVfZCsyZHaMqRRMV7mON qJyKpnOijivmLbXGplfWbJUajYaPnb6ZuMb8pXuCdAgTNuIbhiM14pFvsscVGEX0JU6m njAVJwoLjH7A7g/q20ceYSaOSri/5LYHT1ifah6+LEAcIXufnNj5lTPnI8NDPiUTq6PP dr6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-transfer-encoding :mime-version:date:subject:cc:to:from; bh=3kS/qnd2a8ov52lfE+538XIzqQsrhyBBJ8F+k478ocI=; b=LxSVHbH5Cugf96dpkcNs2ohoAJcgk1zVAIX+zZw50xqEIUJhC9+ZZgrCHlVbSuMflS uiVoESxVOnFW1MEEJlpQtNZU3UnGMbIodUML/NjnelIAF/5q5ZkofE0cDb4sbfcCKq2f +rrcOFG3XysUJi6iJrLj7A/Yz/SKPztDOhqyoiveJ00CvV2zaZyrMdjc2CqUzlHXRA8X UY6rr+ZWHElC+xCjmwYZ2ujM3rJ+Hwb5ti88MkurYc9KJ6B/i7lkczipVRb47N4P9Kp0 SiJNzHfDzCuzCx8qMGtVi8P3p80uQz+9PwWuJdyBBDDenmcQ86i04p1iLfTflZeRRNwn 49PA== 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 g5si2437558plo.108.2019.01.19.17.43.59; Sat, 19 Jan 2019 17:44:17 -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 S1729973AbfATBl1 (ORCPT + 99 others); Sat, 19 Jan 2019 20:41:27 -0500 Received: from mail-out-3.itc.rwth-aachen.de ([134.130.5.48]:30888 "EHLO mail-out-3.itc.rwth-aachen.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728596AbfATBl1 (ORCPT ); Sat, 19 Jan 2019 20:41:27 -0500 X-Greylist: delayed 587 seconds by postgrey-1.27 at vger.kernel.org; Sat, 19 Jan 2019 20:41:26 EST X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A2BXAAAIz0Nc/54agoZjHAEBAQQBAQcEA?= =?us-ascii?q?QGBUwUBAQsBggNmgSkKg3eUAYFomCaBewwBGAsJhECCXiI2Bw0BAwEBAgEBAm0?= =?us-ascii?q?cDIVNBSIECwFGNQImAio1DgWDIgGCAQQLqyx8M4kVgQgFCQGBAYZ1hEGCFoERJ?= =?us-ascii?q?wyFfQOEaYJXAolBmF8HAoEZiWKCd4QjHoohh3IBmnYCAgICCQIUgU0MJYFWcYM?= =?us-ascii?q?7gicXiCSFez8yAXoMIYdPAYEeAQE?= X-IPAS-Result: =?us-ascii?q?A2BXAAAIz0Nc/54agoZjHAEBAQQBAQcEAQGBUwUBAQsBggN?= =?us-ascii?q?mgSkKg3eUAYFomCaBewwBGAsJhECCXiI2Bw0BAwEBAgEBAm0cDIVNBSIECwFGN?= =?us-ascii?q?QImAio1DgWDIgGCAQQLqyx8M4kVgQgFCQGBAYZ1hEGCFoERJwyFfQOEaYJXAol?= =?us-ascii?q?BmF8HAoEZiWKCd4QjHoohh3IBmnYCAgICCQIUgU0MJYFWcYM7gicXiCSFez8yA?= =?us-ascii?q?XoMIYdPAYEeAQE?= X-IronPort-AV: E=Sophos;i="5.56,497,1539640800"; d="scan'208";a="29765256" Received: from rwthex-w2-a.rwth-ad.de ([134.130.26.158]) by mail-in-3.itc.rwth-aachen.de with ESMTP; 20 Jan 2019 02:31:38 +0100 Received: from pebbles.fritz.box (93.131.73.199) by rwthex-w2-a.rwth-ad.de (2a00:8a60:1:e500::26:158) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1531.3; Sun, 20 Jan 2019 02:31:37 +0100 From: =?UTF-8?q?Stefan=20Br=C3=BCns?= To: CC: , Mauro Carvalho Chehab , =?UTF-8?q?Stefan=20Br=C3=BCns?= Subject: [PATCH] media: dvbsky: Avoid leaking dvb frontend Date: Sun, 20 Jan 2019 02:30:04 +0100 X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [93.131.73.199] X-ClientProxiedBy: rwthex-w2-b.rwth-ad.de (2a00:8a60:1:e500::26:159) To rwthex-w2-a.rwth-ad.de (2a00:8a60:1:e500::26:158) Message-ID: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit 14f4eaeddabc ("media: dvbsky: fix driver unregister logic") fixed a use-after-free by removing the reference to the frontend after deleting the backing i2c device. This has the unfortunate side effect the frontend device is never freed in the dvb core leaving a dangling device, leading to errors when the dvb core tries to register the frontend after e.g. a replug as reported here: https://www.spinics.net/lists/linux-media/msg138181.html media: dvbsky: issues with DVBSky T680CI === [ 561.119145] sp2 8-0040: CIMaX SP2 successfully attached [ 561.119161] usb 2-3: DVB: registering adapter 0 frontend 0 (Silicon Labs Si2168)... [ 561.119174] sysfs: cannot create duplicate filename '/class/dvb/ dvb0.frontend0' === The use after free happened as dvb_usbv2_disconnect calls in this order: - dvb_usb_device::props->exit(...) - dvb_usbv2_adapter_frontend_exit(...) + if (fe) dvb_unregister_frontend(fe) + dvb_usb_device::props->frontend_detach(...) Moving the release of the i2c device from exit() to frontend_detach() avoids the dangling pointer access and allows the core to unregister the frontend. This was originally reported for a DVBSky T680CI, but it also affects the MyGica T230C. As all supported devices structure the registration/ unregistration identically, apply the change for all device types. Signed-off-by: Stefan BrĂ¼ns --- drivers/media/usb/dvb-usb-v2/dvbsky.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c index dffcadd8c834..3ff9833597e5 100644 --- a/drivers/media/usb/dvb-usb-v2/dvbsky.c +++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c @@ -604,16 +604,18 @@ static int dvbsky_init(struct dvb_usb_device *d) return 0; } -static void dvbsky_exit(struct dvb_usb_device *d) +static int dvbsky_frontend_detach(struct dvb_usb_adapter *adap) { + struct dvb_usb_device *d = adap_to_d(adap); struct dvbsky_state *state = d_to_priv(d); - struct dvb_usb_adapter *adap = &d->adapter[0]; + + dev_dbg(&d->udev->dev, "%s: adap=%d\n", __func__, adap->id); dvb_module_release(state->i2c_client_tuner); dvb_module_release(state->i2c_client_demod); dvb_module_release(state->i2c_client_ci); - adap->fe[0] = NULL; + return 0; } /* DVB USB Driver stuff */ @@ -629,11 +631,11 @@ static struct dvb_usb_device_properties dvbsky_s960_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_s960_attach, + .frontend_detach = dvbsky_frontend_detach, .init = dvbsky_init, .get_rc_config = dvbsky_get_rc_config, .streaming_ctrl = dvbsky_streaming_ctrl, .identify_state = dvbsky_identify_state, - .exit = dvbsky_exit, .read_mac_address = dvbsky_read_mac_addr, .num_adapters = 1, @@ -656,11 +658,11 @@ static struct dvb_usb_device_properties dvbsky_s960c_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_s960c_attach, + .frontend_detach = dvbsky_frontend_detach, .init = dvbsky_init, .get_rc_config = dvbsky_get_rc_config, .streaming_ctrl = dvbsky_streaming_ctrl, .identify_state = dvbsky_identify_state, - .exit = dvbsky_exit, .read_mac_address = dvbsky_read_mac_addr, .num_adapters = 1, @@ -683,11 +685,11 @@ static struct dvb_usb_device_properties dvbsky_t680c_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_t680c_attach, + .frontend_detach = dvbsky_frontend_detach, .init = dvbsky_init, .get_rc_config = dvbsky_get_rc_config, .streaming_ctrl = dvbsky_streaming_ctrl, .identify_state = dvbsky_identify_state, - .exit = dvbsky_exit, .read_mac_address = dvbsky_read_mac_addr, .num_adapters = 1, @@ -710,11 +712,11 @@ static struct dvb_usb_device_properties dvbsky_t330_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_t330_attach, + .frontend_detach = dvbsky_frontend_detach, .init = dvbsky_init, .get_rc_config = dvbsky_get_rc_config, .streaming_ctrl = dvbsky_streaming_ctrl, .identify_state = dvbsky_identify_state, - .exit = dvbsky_exit, .read_mac_address = dvbsky_read_mac_addr, .num_adapters = 1, @@ -737,11 +739,11 @@ static struct dvb_usb_device_properties mygica_t230c_props = { .i2c_algo = &dvbsky_i2c_algo, .frontend_attach = dvbsky_mygica_t230c_attach, + .frontend_detach = dvbsky_frontend_detach, .init = dvbsky_init, .get_rc_config = dvbsky_get_rc_config, .streaming_ctrl = dvbsky_streaming_ctrl, .identify_state = dvbsky_identify_state, - .exit = dvbsky_exit, .num_adapters = 1, .adapter = { -- 2.20.1