Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp5028752pxb; Mon, 15 Feb 2021 07:44:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRxYuA9jbhkaMdPQwaiOh28HwBspn9MMw7QiuBbnA1hcn7NkiQ90RZXuoYx+l/zPXhun44 X-Received: by 2002:a17:907:2a85:: with SMTP id fl5mr15965689ejc.554.1613403861410; Mon, 15 Feb 2021 07:44:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613403861; cv=none; d=google.com; s=arc-20160816; b=uCLnVjdGFNcyhXEzqmtYKxmhsU4WvZyPSmOWBjtzSCjHSKjRc7oMFwGmY3m+gujQlB 6PrR4n67n6ofTVMuLaFzyfJvWCb+n4BQXFdlxQMxP5/N+JwgFKain8YP0FQ1ubxFGbTJ +9lafTVys5e2+Bujn8BIbRsMcrquZ9PPpi5CZIXovdPXYozpHD0Vs6xcKOhT5EmdL1TW pJobWg0mGrdidp2EM+LtVQTB+lvIv5GxPJXgikTeetupoX7FMbiWaMgSSRzCLZ/wiSkH mbtd/BlIvRf71sVxtqs8tamkISb1Sd28B/SNUMeHK+lwitNZV4laYwA7VgygvTNm0dg1 gMNg== 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=dT+WJOuQyhMe4ZOS/BVBusHaJqSA23MSjJFiBv0/uqI=; b=wtBNhzmhI5hOq8iROWK6tXGLPD9kPsR5nHc+dkk7soERdQJ2AXgvK6mnI+YTN3fUMO xKToMWFOrwnG2+s+v3QmnnvtstRD9ZpIMU7Glaur8wAW3FQR72NpbI1LrteNA3DCQXpl 7OE3s18cx/xsof3TGqB1UFJCuNSQqJBnHG/IXSgOSz+M5y/pI9wLBbChofGdsSEMkN3D R+6t3H1pS+3DrwAa/GydjBigo0W8GM3S7oGpo/ki3OmMpa5FBcslgfIRNlGhJyxFnFjZ e24goq8IOA71IfxjRdlSNhOv980rq1ZfPSb+KmgP5LsZVIbrWc+0DehEWmMbyI/VlzYK lRRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="VI9mX/vP"; 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 a16si11648904eje.331.2021.02.15.07.43.58; Mon, 15 Feb 2021 07:44:21 -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="VI9mX/vP"; 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 S231518AbhBOPnI (ORCPT + 99 others); Mon, 15 Feb 2021 10:43:08 -0500 Received: from mail.kernel.org ([198.145.29.99]:45560 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230522AbhBOPau (ORCPT ); Mon, 15 Feb 2021 10:30:50 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0A5DC64E7F; Mon, 15 Feb 2021 15:28:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1613402938; bh=yF46woBKIBG5B+76iINJ0iOuE3Lo+DNwSrpN42NtBzQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VI9mX/vPhi8R8a7sagLwiKlM0nYdAtb2NBx28t6UY+AgjVLNNdS++qNoQ2FB6Atmv D+XTHyfg2kuKnvxpH2/jVFj/BdReR/p2fY5Ne+GO3ZiLXcNwxAbodcs6ChMpWrXtei sULtXHFuOXRudWiswEszbISN0gFAPstAvLI36MRc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Boris Brezillon , Eric Anholt , Maxime Ripard , Thomas Zimmermann , Dave Stevenson , Sasha Levin Subject: [PATCH 5.4 27/60] drm/vc4: hvs: Fix buffer overflow with the dlist handling Date: Mon, 15 Feb 2021 16:27:15 +0100 Message-Id: <20210215152716.218475179@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210215152715.401453874@linuxfoundation.org> References: <20210215152715.401453874@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: Maxime Ripard [ Upstream commit facd93f4285c405f9a91b05166147cb39e860666 ] Commit 0a038c1c29a7 ("drm/vc4: Move LBM creation out of vc4_plane_mode_set()") changed the LBM allocation logic from first allocating the LBM memory for the plane to running mode_set, adding a gap in the LBM, and then running the dlist allocation filling that gap. The gap was introduced by incrementing the dlist array index, but was never checking whether or not we were over the array length, leading eventually to memory corruptions if we ever crossed this limit. vc4_dlist_write had that logic though, and was reallocating a larger dlist array when reaching the end of the buffer. Let's share the logic between both functions. Cc: Boris Brezillon Cc: Eric Anholt Fixes: 0a038c1c29a7 ("drm/vc4: Move LBM creation out of vc4_plane_mode_set()") Signed-off-by: Maxime Ripard Acked-by: Thomas Zimmermann Reviewed-by: Dave Stevenson Link: https://patchwork.freedesktop.org/patch/msgid/20210129160647.128373-1-maxime@cerno.tech Signed-off-by: Sasha Levin --- drivers/gpu/drm/vc4/vc4_plane.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c index 5e5f90810acaf..363f456ea7134 100644 --- a/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c @@ -205,7 +205,7 @@ static void vc4_plane_reset(struct drm_plane *plane) __drm_atomic_helper_plane_reset(plane, &vc4_state->base); } -static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val) +static void vc4_dlist_counter_increment(struct vc4_plane_state *vc4_state) { if (vc4_state->dlist_count == vc4_state->dlist_size) { u32 new_size = max(4u, vc4_state->dlist_count * 2); @@ -220,7 +220,15 @@ static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val) vc4_state->dlist_size = new_size; } - vc4_state->dlist[vc4_state->dlist_count++] = val; + vc4_state->dlist_count++; +} + +static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val) +{ + unsigned int idx = vc4_state->dlist_count; + + vc4_dlist_counter_increment(vc4_state); + vc4_state->dlist[idx] = val; } /* Returns the scl0/scl1 field based on whether the dimensions need to @@ -871,8 +879,10 @@ static int vc4_plane_mode_set(struct drm_plane *plane, * be set when calling vc4_plane_allocate_lbm(). */ if (vc4_state->y_scaling[0] != VC4_SCALING_NONE || - vc4_state->y_scaling[1] != VC4_SCALING_NONE) - vc4_state->lbm_offset = vc4_state->dlist_count++; + vc4_state->y_scaling[1] != VC4_SCALING_NONE) { + vc4_state->lbm_offset = vc4_state->dlist_count; + vc4_dlist_counter_increment(vc4_state); + } if (num_planes > 1) { /* Emit Cb/Cr as channel 0 and Y as channel -- 2.27.0