Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1285704pxb; Sun, 17 Jan 2021 03:32:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJwkSaLp+JAS5Y5DTX7whoDGiPcUT+GOaRuSjCrvEftxGasaVDJlgL5TEJfMr1gt21DWj2S1 X-Received: by 2002:a05:6402:60a:: with SMTP id n10mr7927406edv.230.1610883149225; Sun, 17 Jan 2021 03:32:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610883149; cv=none; d=google.com; s=arc-20160816; b=vtB+u26c6z1hFSNyuWPWP4WnD0Y/d2At/6i1D3hq07R60b8TkafcBw2wUuXhR60WY1 I+n0lQg46kGGgm0ovI7YAAZU3JhAh7qqwxVaYcOUbKN1WvqYyI+OkNex0ELNKmQ+1wCh DU4EQ1EiSQ5YwojJBGlSbSSAIBheuX/iPdIO2l94HDDledkkwK1mQAK/TWvwUqoyBqLF HU6YWAfLbxJza80iOgS/sHlr+B/CnaK2bbdDoqUQKvZ94CQIQ8hFLQ2VRrsVSlVa/6iW GkuXk+d+fOQb8H6Qi0HINnZ5otG7qiYBptftwyECo6oyrsTSHwmUpKTBzEOcsIv9tlNx IFKA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=xdzHZ07OOQmAFnlui7hdo0tsrWdYPzwmzVRg2ZPJPNs=; b=sm7AnPeyUTiNH5T1hGa5AYWbw4plSRJwMI/KMD5r2lxdaiu7++KzIKHZdEr3/sZjVQ jHcjUoRTI6yCKIs60Zk9bvXAj5uV3ID6Lb2PFpfLtrGxzODXwNcqmtaxEo32qwksDL07 CWaAcJBQsa+aHJWhublYGDQ2DhHUvrgZoD07wsQoVueVq1RyrWJS3rgCjPzYADc3NUcy e6U5BKyGW7y7FgDtAXZHIQ7TmdDaLt2XdGL4I/a1KDQqb/b3b+M6sJpR6NpVijJegIfI SGb13X31d5f9FVX5/boOa4lSWtB5OJkkrWccy0MxOf0NyJ5DwdnwKQPe1LMRWUgJeCxI YnYA== 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=crapouillou.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s18si6418399eji.420.2021.01.17.03.32.06; Sun, 17 Jan 2021 03:32:29 -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; 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=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728499AbhAQL3Z (ORCPT + 99 others); Sun, 17 Jan 2021 06:29:25 -0500 Received: from aposti.net ([89.234.176.197]:36706 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728382AbhAQL3W (ORCPT ); Sun, 17 Jan 2021 06:29:22 -0500 From: Paul Cercueil To: David Airlie , Daniel Vetter Cc: Sam Ravnborg , od@zcrc.me, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Paul Cercueil , stable@vger.kernel.org Subject: [PATCH 2/3] drm/ingenic: Register devm action to cleanup encoders Date: Sun, 17 Jan 2021 11:26:45 +0000 Message-Id: <20210117112646.98353-3-paul@crapouillou.net> In-Reply-To: <20210117112646.98353-1-paul@crapouillou.net> References: <20210117112646.98353-1-paul@crapouillou.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since the encoders have been devm-allocated, they will be freed way before drm_mode_config_cleanup() is called. To avoid use-after-free conditions, we then must ensure that drm_encoder_cleanup() is called before the encoders are freed. Fixes: c369cb27c267 ("drm/ingenic: Support multiple panels/bridges") Cc: # 5.8+ Signed-off-by: Paul Cercueil --- drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c index 368bfef8b340..d23a3292a0e0 100644 --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c @@ -803,6 +803,11 @@ static void __maybe_unused ingenic_drm_release_rmem(void *d) of_reserved_mem_device_release(d); } +static void ingenic_drm_encoder_cleanup(void *encoder) +{ + drm_encoder_cleanup(encoder); +} + static int ingenic_drm_bind(struct device *dev, bool has_components) { struct platform_device *pdev = to_platform_device(dev); @@ -1011,6 +1016,11 @@ static int ingenic_drm_bind(struct device *dev, bool has_components) return ret; } + ret = devm_add_action_or_reset(dev, ingenic_drm_encoder_cleanup, + encoder); + if (ret) + return ret; + ret = drm_bridge_attach(encoder, bridge, NULL, 0); if (ret) { dev_err(dev, "Unable to attach bridge\n"); -- 2.29.2