Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp1238346pxu; Mon, 23 Nov 2020 15:36:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJweQDfFrijBkbJ+r+G2PHJ5QzZxVCqx8aEkCE5+ftPz71xsA11o5wFF+cEtbbd/jQso3ZPN X-Received: by 2002:a17:906:174f:: with SMTP id d15mr1872662eje.15.1606174599104; Mon, 23 Nov 2020 15:36:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606174599; cv=none; d=google.com; s=arc-20160816; b=nqRdk+aeJQZaguROQqhFePx2jXMzePo5HSONy+xgK/DgLzqhjvB4YOrDb4POtxKjrI UeOHd0LT3dbGDFltyGuhcdDqjuHCwn+RIFsGlkCv+GBOY06/5UGg10HtyJoKT7n/i2QK Ma0LaxEn83bP5fGjAq0ArIEB7bYZyHm/Jl4zf8L24CQo+BE99LtWvwP3M39efrnJos5C dNASMC6FDgHiyRnQcwK72hi1w/B2PQjf5y1vea4K/mKZAaw6/REKDASWWbOK/Ja12UNd fVojR9RBHCM0xbtJUKpNKYWY+VxINp/v0E9JXCwpuWW9BBv7+oFsH78MwgLzLaxzdry5 Fpvw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=j8UFq4auJyJwZgZnvmFcOeOp+OXph3US/E5MQNuQomk=; b=DdyFEhtxTMg+r8ppmjginSE67cm/DSrxRIFdSpdLYhrpIpEhwt5sUF7jYazwEb4nap 93widDaHMY9iAEo/wDTP5TWuWivZeo6kcJcQAieg1bq+y3XjTP0hTH67PRhL7Jb4I3vQ C9SGyiSmxqMsrUsxZjqChwbpVq9cUIIfEJTej52XGYTSpJlLI9LLKRS9QNfStp2eCw0p iyQjMikHWJPZFDHyL5tFK8H8OBjUM0KnISx3HKrUn+ctQaUa9ypRqsMul34o9ACudMd2 YCni2usMvo9xT0OrnDUUOnQBlmDzlOeb9DCrLQuloAZiXHHaK24uUvP7jaxjaql+NVmI +C3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=E7f09wYW; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jt2si6108001ejb.552.2020.11.23.15.36.16; Mon, 23 Nov 2020 15:36:39 -0800 (PST) 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=@linuxfoundation.org header.s=korg header.b=E7f09wYW; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731190AbgKWMdR (ORCPT + 99 others); Mon, 23 Nov 2020 07:33:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:44176 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731149AbgKWMc6 (ORCPT ); Mon, 23 Nov 2020 07:32:58 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 B403420857; Mon, 23 Nov 2020 12:32:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606134777; bh=pcZCWID/4hnB0Wdf7edu0WS6n5erSAElGHQbmYw2bfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E7f09wYWGYKsijGVCE6Gl9AxCCnP+K2CuO8DUqs5KVaNt4hXJf3rehM5Occtkxeoy Oesm5FYFs3/TW+XxnogOsfgviwu1Eh/oJt3UAUjoyEkkHG5xXhXiTiGeBPLXa9rRMx 16HXEz8POjd96frgi/Rtpihfr4GFIt9Bgbs2f6/o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= , Mark Brown , Ahmad Fatoum Subject: [PATCH 4.19 79/91] regulator: fix memory leak with repeated set_machine_constraints() Date: Mon, 23 Nov 2020 13:22:39 +0100 Message-Id: <20201123121813.163118071@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201123121809.285416732@linuxfoundation.org> References: <20201123121809.285416732@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michał Mirosław commit 57a6ad482af256b2a13de14194fb8f67c1a65f10 upstream. Fixed commit introduced a possible second call to set_machine_constraints() and that allocates memory for rdev->constraints. Move the allocation to the caller so it's easier to manage and done once. Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator") Cc: stable@vger.kernel.org Signed-off-by: Michał Mirosław Tested-by: Ahmad Fatoum # stpmic1 Link: https://lore.kernel.org/r/78c3d4016cebc08d441aad18cb924b4e4d9cf9df.1605226675.git.mirq-linux@rere.qmqm.pl Signed-off-by: Mark Brown Signed-off-by: Greg Kroah-Hartman --- drivers/regulator/core.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1091,7 +1091,6 @@ static int _regulator_do_enable(struct r /** * set_machine_constraints - sets regulator constraints * @rdev: regulator source - * @constraints: constraints to apply * * Allows platform initialisation code to define and constrain * regulator circuits e.g. valid voltage/current ranges, etc. NOTE: @@ -1099,21 +1098,11 @@ static int _regulator_do_enable(struct r * regulator operations to proceed i.e. set_voltage, set_current_limit, * set_mode. */ -static int set_machine_constraints(struct regulator_dev *rdev, - const struct regulation_constraints *constraints) +static int set_machine_constraints(struct regulator_dev *rdev) { int ret = 0; const struct regulator_ops *ops = rdev->desc->ops; - if (constraints) - rdev->constraints = kmemdup(constraints, sizeof(*constraints), - GFP_KERNEL); - else - rdev->constraints = kzalloc(sizeof(*constraints), - GFP_KERNEL); - if (!rdev->constraints) - return -ENOMEM; - ret = machine_constraints_voltage(rdev, rdev->constraints); if (ret != 0) return ret; @@ -4257,7 +4246,6 @@ struct regulator_dev * regulator_register(const struct regulator_desc *regulator_desc, const struct regulator_config *cfg) { - const struct regulation_constraints *constraints = NULL; const struct regulator_init_data *init_data; struct regulator_config *config = NULL; static atomic_t regulator_no = ATOMIC_INIT(-1); @@ -4358,14 +4346,23 @@ regulator_register(const struct regulato /* set regulator constraints */ if (init_data) - constraints = &init_data->constraints; + rdev->constraints = kmemdup(&init_data->constraints, + sizeof(*rdev->constraints), + GFP_KERNEL); + else + rdev->constraints = kzalloc(sizeof(*rdev->constraints), + GFP_KERNEL); + if (!rdev->constraints) { + ret = -ENOMEM; + goto wash; + } if (init_data && init_data->supply_regulator) rdev->supply_name = init_data->supply_regulator; else if (regulator_desc->supply_name) rdev->supply_name = regulator_desc->supply_name; - ret = set_machine_constraints(rdev, constraints); + ret = set_machine_constraints(rdev); if (ret == -EPROBE_DEFER) { /* Regulator might be in bypass mode and so needs its supply * to set the constraints */ @@ -4374,7 +4371,7 @@ regulator_register(const struct regulato * that is just being created */ ret = regulator_resolve_supply(rdev); if (!ret) - ret = set_machine_constraints(rdev, constraints); + ret = set_machine_constraints(rdev); else rdev_dbg(rdev, "unable to resolve supply early: %pe\n", ERR_PTR(ret));