Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp14761ybl; Sat, 30 Nov 2019 19:08:41 -0800 (PST) X-Google-Smtp-Source: APXvYqyXF2K/hIsoXlcyp+n0/JLWV21HRDdxwIDuspfZsJCpn8WaQTTHHxHkXc9lIdE0UeJNT2Og X-Received: by 2002:a17:906:71b:: with SMTP id y27mr17486276ejb.54.1575169721156; Sat, 30 Nov 2019 19:08:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1575169721; cv=none; d=google.com; s=arc-20160816; b=oOCYcQ8BN7LsFr5ak125n4oXw/PT0xPZUy4t8lazZPKSngsR3kCJBFC2PAj9fFXALH FmKKqh7wtJCEQHwuKWSpgCYFE/+xoiw9euSHOKoDU0o5osCa/BvHLfZBwHSyrt7f6xHk nYWNBvfZDzszB5g4SQ7ftkv2KnyyoaEsWDy8rhjGKfmj9808AJYbAOmZeIFiHS8wY2kF cGadHZaeUfR6kOKJbDNmTwdk4/kji9VS8twPhM5jY27bz9ZtqpSV0z3ilSSrBQd67dTw GDb0j2Eitnvrr9hrL5NDCpf+cwcrkyzZu6EAiJ1fADqbdVX3+Ejhic8zDP13u1+wlG97 51dA== 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 :message-id:date:subject:cc:to:from; bh=WIGf9MTguUdJ6LZx5d9zcL32Z0m78X890M7/AZmI0is=; b=snJncKyBFB5JkQlMkrLPDc0dN29CuyDQYifPQdPG+zWks0eNIYXWWt4W03bSUyDD2w vM4SvbhsadT8R9L0g1QN7xgULZLS3+8Wgvt0sMI4Ujh0i9sQWrxsq24pdEIUdrPnuJPt WGy91dR55sXzgCPYKCxbrti0JqZjfqYksfu+BocPGgt0ZP9KzfkQvPTpNnRQWKtsGg6u e6RkOzLBWRaayNhztGbsahlobFToFnRO1W+A0/fjkqY80MDtjxG/fC4cTPF2HboWBN7K TsYOnVSdmryAav4F+femnWcx1J4Jx8mxfjyRpgaLOhWIjo8F2z42EyVOY1ampgnaVD8I taQA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x16si16954607ejw.375.2019.11.30.19.07.48; Sat, 30 Nov 2019 19:08: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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727186AbfLADDX (ORCPT + 99 others); Sat, 30 Nov 2019 22:03:23 -0500 Received: from out30-130.freemail.mail.aliyun.com ([115.124.30.130]:44359 "EHLO out30-130.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726906AbfLADDX (ORCPT ); Sat, 30 Nov 2019 22:03:23 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R961e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04423;MF=wenyang@linux.alibaba.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---0TjWnwF9_1575169372; Received: from localhost(mailfrom:wenyang@linux.alibaba.com fp:SMTPD_---0TjWnwF9_1575169372) by smtp.aliyun-inc.com(127.0.0.1); Sun, 01 Dec 2019 11:03:00 +0800 From: Wen Yang To: Mark Brown , Liam Girdwood Cc: xlpang@linux.alibaba.com, Wen Yang , linux-kernel@vger.kernel.org Subject: [PATCH] regulator: core: fix regulator_register() error paths to properly release rdev Date: Sun, 1 Dec 2019 11:02:50 +0800 Message-Id: <20191201030250.38074-1-wenyang@linux.alibaba.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are several issues with the error handling code of the regulator_register() function: ret = device_register(&rdev->dev); if (ret != 0) { put_device(&rdev->dev); --> rdev released goto unset_supplies; } ... unset_supplies: ... unset_regulator_supplies(rdev); --> use-after-free ... clean: if (dangling_of_gpiod) gpiod_put(config->ena_gpiod); kfree(rdev); --> double free We add a variable to record the failure of device_register() and move put_device() down a bit to avoid the above issues. Fixes: c438b9d01736 ("regulator: core: Move registration of regulator device") Signed-off-by: Wen Yang Cc: Liam Girdwood Cc: Mark Brown Cc: linux-kernel@vger.kernel.org --- drivers/regulator/core.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 09a3550..4b22622 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -5002,6 +5002,7 @@ struct regulator_dev * struct regulator_dev *rdev; bool dangling_cfg_gpiod = false; bool dangling_of_gpiod = false; + bool reg_device_fail = false; struct device *dev; int ret, i; @@ -5187,7 +5188,7 @@ struct regulator_dev * dev_set_drvdata(&rdev->dev, rdev); ret = device_register(&rdev->dev); if (ret != 0) { - put_device(&rdev->dev); + reg_device_fail = true; goto unset_supplies; } @@ -5218,7 +5219,10 @@ struct regulator_dev * clean: if (dangling_of_gpiod) gpiod_put(config->ena_gpiod); - kfree(rdev); + if (reg_device_fail) + put_device(&rdev->dev); + else + kfree(rdev); kfree(config); rinse: if (dangling_cfg_gpiod) -- 1.8.3.1