Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp3039463pxb; Fri, 8 Oct 2021 23:33:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyQqDrkjUVqLg1fkyG65LdYsJxR+Rk6TUlA7KQCxVeQmFn+wQQHJ+zBoCFBYAKMfQaYwAwM X-Received: by 2002:a63:d114:: with SMTP id k20mr8295829pgg.2.1633761194168; Fri, 08 Oct 2021 23:33:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633761194; cv=none; d=google.com; s=arc-20160816; b=wvUG7rmZo6JSxFFT4h3tIE2WApX9i+++orzL9BUPHZpXOq8TDSLOOmkn6j3Zs3lWXo vNxls9LtCFVVN1xdKD+ri+ci4gdRjQgesgiEkXJwB/EC4SBHYdKwIAhC1nIpJV1+8iff KiAh+bVQmfUt4cgEYDViRgocQPnU+uls/Nq78tMAK56XpQ0+6a0Lp9QLP8w8t/vOLXI2 k5R0emZTFTO3l+XQJhNylgqEDcOVbfwPHvBaDlI5nWVl44w9Op04c4zwBX+gbqvfK5pk GCundPXhMazAk6F3vM/7NFrA6DVbxQcw1Ov7tK7HfhAdyOizZunxMGqvl8HGPS/eX7RZ ff+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=SuYOZEfRh6zVppiIh0yvbMW0nDlXw6q0WkZWIouArwU=; b=Jl15m6uXiFQbuXnNgaR/uDAlFBGDWS7rjdOpgYnh3YE565+GOm/lyKduLqBMiMsJ/Y sbmTP91s3A0+z9CrkuK2NcD/Q4xzrjCjHGtpYCbDfuCiFl4Wx//5xp5YPvi7oiUyI9EA G/ygOykUVbNg7wKgKYDqhM0VD1+aDCPjaNGuyXUfeJqA/L9gbyN0/Zjz+uI13/sts6es h8tM+vAQ4mENa0yF8LTG4TIdzKUjJDxiginINGcBn7GIDZTItg6IKvdXWObNXxH7GiPd 6+ZnqkCRoaaIqv9DkOc8T35GRsm96y6DUaSf6trbkTJm5VuKR8QKvAyJ4HB0MHeZbYXY 180A== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k8si2142456pll.435.2021.10.08.23.33.01; Fri, 08 Oct 2021 23:33:14 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232605AbhJIGeQ (ORCPT + 99 others); Sat, 9 Oct 2021 02:34:16 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:23358 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230136AbhJIGeP (ORCPT ); Sat, 9 Oct 2021 02:34:15 -0400 Received: from dggemv711-chm.china.huawei.com (unknown [172.30.72.57]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4HRFVJ36HNzYkMC; Sat, 9 Oct 2021 14:27:52 +0800 (CST) Received: from dggpeml500017.china.huawei.com (7.185.36.243) by dggemv711-chm.china.huawei.com (10.1.198.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.8; Sat, 9 Oct 2021 14:31:56 +0800 Received: from huawei.com (10.175.103.91) by dggpeml500017.china.huawei.com (7.185.36.243) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.8; Sat, 9 Oct 2021 14:31:56 +0800 From: Yang Yingliang To: , CC: , , Subject: [PATCH] iio: core: fix double free in iio_device_unregister_sysfs() Date: Sat, 9 Oct 2021 14:39:35 +0800 Message-ID: <20211009063935.3187803-1-yangyingliang@huawei.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.103.91] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To dggpeml500017.china.huawei.com (7.185.36.243) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I got the double free report: [ 68.308365][ T359] BUG: KASAN: double-free or invalid-free in kfree+0xce/0x390 [ 68.309532][ T359] [ 68.309886][ T359] CPU: 0 PID: 359 Comm: xrun Tainted: G W 5.15.0-rc3-00109-g4dfd49fafc4d-dirty #474 523b7f3c65c42247635e2ac04a95f61f9f36678d [ 68.312059][ T359] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 [ 68.313566][ T359] Call Trace: [ 68.314063][ T359] dump_stack_lvl+0xe2/0x152 [ 68.314793][ T359] print_address_description.constprop.7+0x21/0x150 [ 68.315842][ T359] ? kfree+0xce/0x390 [ 68.316444][ T359] kasan_report_invalid_free+0x6f/0xa0 [ 68.317289][ T359] ? kfree+0xce/0x390 [ 68.317902][ T359] __kasan_slab_free+0x125/0x140 [ 68.318660][ T359] slab_free_freelist_hook+0x10d/0x240 [ 68.319497][ T359] ? iio_device_unregister_sysfs+0x108/0x13b [industrialio] [ 68.321179][ T359] kfree+0xce/0x390 [ 68.321781][ T359] iio_device_unregister_sysfs+0x108/0x13b [industrialio] [ 68.323438][ T359] iio_dev_release+0x9e/0x10e [industrialio] [ 68.324902][ T359] ? iio_device_unregister_sysfs+0x13b/0x13b [industrialio] [ 68.326550][ T359] device_release+0xa5/0x240 [ 68.327258][ T359] kobject_put+0x1e5/0x540 [ 68.327954][ T359] put_device+0x20/0x30 [ 68.328612][ T359] devm_iio_device_release+0x21/0x30 [industrialio] [ 68.330172][ T359] release_nodes+0xc3/0x3b0 [ 68.330874][ T359] ? __sanitizer_cov_trace_pc+0x1d/0x50 [ 68.331765][ T359] ? _raw_spin_unlock_irqrestore+0x4b/0x5d [ 68.332668][ T359] ? trace_hardirqs_on+0x63/0x2d0 [ 68.333509][ T359] devres_release_group+0x1da/0x2c0 [ 68.334325][ T359] ? release_nodes+0x3b0/0x3b0 [ 68.335069][ T359] ? __devm_iio_device_register+0x36/0x80 [industrialio] [ 68.336721][ T359] ? max517_probe+0x3df/0x6b0 [max517] [ 68.338122][ T359] i2c_device_probe+0x628/0xbb0 [ 68.338886][ T359] ? i2c_device_match+0x110/0x110 [ 68.339674][ T359] really_probe+0x285/0xc30 If __iio_device_register() fails, iio_dev_opaque->groups will be freed in error path in iio_device_unregister_sysfs(), then iio_dev_release() will call iio_device_unregister_sysfs() again, it causes double free. Set iio_dev_opaque->groups to NULL when it's freed to fix this double free. Fixes: 32f171724e5c ("iio: core: rework iio device group creation") Reported-by: Hulk Robot Signed-off-by: Yang Yingliang --- drivers/iio/industrialio-core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index 2dbb37e09b8c..2dc837db50f7 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -1600,6 +1600,7 @@ static void iio_device_unregister_sysfs(struct iio_dev *indio_dev) kfree(iio_dev_opaque->chan_attr_group.attrs); iio_dev_opaque->chan_attr_group.attrs = NULL; kfree(iio_dev_opaque->groups); + iio_dev_opaque->groups = NULL; } static void iio_dev_release(struct device *device) -- 2.25.1