Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1975380ybh; Tue, 14 Jul 2020 12:04:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw6IR9UMs8qBd2xrylU5rabPIBEwnUa9uUKEr61MgqtYiEHfvVC9H8WEYzuHV8FOFsTdZxP X-Received: by 2002:a17:906:4447:: with SMTP id i7mr5631945ejp.191.1594753469758; Tue, 14 Jul 2020 12:04:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594753469; cv=none; d=google.com; s=arc-20160816; b=NBkFUlMrF4HyFZ9BLrwsVXUVuomEAPwk+CL6nrdA1lWZl8rZ2rhxRoqr/0/CP+vWpS 0Fq8w9ZFcCUybo7IT7kc4DHc2yP065KZHVe2j4owZeXik7H4JTjwkHgahvfbbmjIlvUc sgS94PdPOjNpfWaeVPxzCzPPrA0g4nps0GvKKdfYSw27xTluetaJDIWsHwzWSLiq262x XLstT1F8Xxom8pSv03MEtdbAoY5sQEtXaZpkaYjakOSdVEXcrfF06z/SfUUO9BrgZPZ9 9yxgTrYgVtE06vp/MIW18yAHfIpSyx+Nhm107uRRvzHSINt9HIzp5DFLuypCfHBZbmD6 HR0g== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=v3z+oJocxEe4ZQW5x53VTKG+f72s9z2TMB6cmhKCt0E=; b=LVzemSqyI2UV4YXu5WiyWJ1zprxF8fdmw9re/A45Sy6NQxvdLOCOvPm9vRP00k2R2G n/k3RnCDlNP7JvsUN97DwkpWz5IxX7AORrCa4xPwfaIuaPtX3Q/Q1ITVa7i/Ot2v5VMH ZpgZP1zbVroExNtSEX6QECPEhHtrLAk7McSU72ptWNM0O8w0a6Ui1IzkKAikf56sLH7U pAGf/EcdbrnfbDosshrmupd2RZV0e7kWI4KjBj9PLx5S5Q0X423c6chALqou7FRIv01D KFKFX3tytedYrXns3K24INN52d6BJTDUgPyOISKrlRRUHMC3sil/cnynrntDRmi/30Od 3eFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mBIXGo01; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o23si11967294ejx.620.2020.07.14.12.04.04; Tue, 14 Jul 2020 12:04:29 -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; dkim=pass header.i=@kernel.org header.s=default header.b=mBIXGo01; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731291AbgGNTB6 (ORCPT + 99 others); Tue, 14 Jul 2020 15:01:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:57678 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730154AbgGNS7H (ORCPT ); Tue, 14 Jul 2020 14:59:07 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 B2E17207F5; Tue, 14 Jul 2020 18:59:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1594753147; bh=ZoJll4LksI40TPNtumYVwQbqJz3alFiU1ldCO5srpFQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mBIXGo01oXTV5w7Sq8Hn0nOG/7JN9cBjRqGw3uD96vn+zvwVrWkHbvhMw4fQyarPU K4r0ESX+vTywDQUamrH/wzlSNbPUbkm9WQh4C+uGXI1tLuX+znuA//KUpjLk7PHbLz zsqWD8xratdnb+9g4RPEvprXa180wQTPgHrqMh2s= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Tom Rix , Alex Deucher Subject: [PATCH 5.7 138/166] drm/radeon: fix double free Date: Tue, 14 Jul 2020 20:45:03 +0200 Message-Id: <20200714184122.442239512@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200714184115.844176932@linuxfoundation.org> References: <20200714184115.844176932@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tom Rix commit 41855a898650803e24b284173354cc3e44d07725 upstream. clang static analysis flags this error drivers/gpu/drm/radeon/ci_dpm.c:5652:9: warning: Use of memory after it is freed [unix.Malloc] kfree(rdev->pm.dpm.ps[i].ps_priv); ^~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/ci_dpm.c:5654:2: warning: Attempt to free released memory [unix.Malloc] kfree(rdev->pm.dpm.ps); ^~~~~~~~~~~~~~~~~~~~~~ problem is reported in ci_dpm_fini, with these code blocks. for (i = 0; i < rdev->pm.dpm.num_ps; i++) { kfree(rdev->pm.dpm.ps[i].ps_priv); } kfree(rdev->pm.dpm.ps); The first free happens in ci_parse_power_table where it cleans up locally on a failure. ci_dpm_fini also does a cleanup. ret = ci_parse_power_table(rdev); if (ret) { ci_dpm_fini(rdev); return ret; } So remove the cleanup in ci_parse_power_table and move the num_ps calculation to inside the loop so ci_dpm_fini will know how many array elements to free. Fixes: cc8dbbb4f62a ("drm/radeon: add dpm support for CI dGPUs (v2)") Signed-off-by: Tom Rix Signed-off-by: Alex Deucher Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/radeon/ci_dpm.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c @@ -5577,6 +5577,7 @@ static int ci_parse_power_table(struct r if (!rdev->pm.dpm.ps) return -ENOMEM; power_state_offset = (u8 *)state_array->states; + rdev->pm.dpm.num_ps = 0; for (i = 0; i < state_array->ucNumEntries; i++) { u8 *idx; power_state = (union pplib_power_state *)power_state_offset; @@ -5586,10 +5587,8 @@ static int ci_parse_power_table(struct r if (!rdev->pm.power_state[i].clock_info) return -EINVAL; ps = kzalloc(sizeof(struct ci_ps), GFP_KERNEL); - if (ps == NULL) { - kfree(rdev->pm.dpm.ps); + if (ps == NULL) return -ENOMEM; - } rdev->pm.dpm.ps[i].ps_priv = ps; ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], non_clock_info, @@ -5611,8 +5610,8 @@ static int ci_parse_power_table(struct r k++; } power_state_offset += 2 + power_state->v2.ucNumDPMLevels; + rdev->pm.dpm.num_ps = i + 1; } - rdev->pm.dpm.num_ps = state_array->ucNumEntries; /* fill in the vce power states */ for (i = 0; i < RADEON_MAX_VCE_LEVELS; i++) {