Received: by 2002:a05:7412:37c9:b0:e2:908c:2ebd with SMTP id jz9csp941865rdb; Tue, 19 Sep 2023 15:20:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGVQh7Q05veqI1Vpe/mdJblXrK/jyK4ZdGk/jNgoUvJjMdm7h2044sLS2A/XEa5rehvEAu0 X-Received: by 2002:a05:6a00:194f:b0:68f:e810:e889 with SMTP id s15-20020a056a00194f00b0068fe810e889mr1092969pfk.31.1695162010410; Tue, 19 Sep 2023 15:20:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695162010; cv=none; d=google.com; s=arc-20160816; b=qOqFz65G8DvTU29au67ztitELD7uqs5v+6pYqD4ihm0iHqvuQ92gdN6wMY8XFEXXRu qgw63fXpxGVKQZy7JFPDcOKaGdYq6B+OATwH5yVLYEb5fgaHcNFoolWjxDeUJUmK/vtq wOTJQGqv5XuOYqDg63m6tkudcQHI3Q5ZLtzwQj2XlIx3tag+vaY2Ixa6Tj3DKP6KIqgJ FNBM6dxbnSZK4ShArxXizMuGVSchxlao3edK97bqAgwN7qzFyL0qwI7MCJbCda4vSmcx 3dEmkzTJv3Y6z8b0fJvHppQWEwNhxp3SG/SqOBdf2N3oRi2l3ZmfouyrozrU0afS5BmG wq6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:mime-version:date :message-id:dkim-signature; bh=VMi5+7ZvzTwfMWgziI09KuaClzuCuTi5rZ6FResnfjI=; fh=23KSZsoRY+M6TAsBHiGHjFnAyKPwYVn2QhOaLmkvl0k=; b=EpVptSjiOXAvW4fhn4CE3XYApDmVVfPZ3O6UtsK9RwVqgKDGx6YjhYfdxKs0AlQ1XE vbo+NpiJRAPkQ17cVRr3rhxotE2XEy2fEhVYlRn+2EofABeQnuOb0HvQkkFHJcDYg5h7 +WZZOjWEzVUtaySCY4KznBBaIqueRFWgtq6vNoN97WulrbU/yWt2UlM+NpG2kQIepPJl hK95HZ3ENVbl4NUz0Hf+utwMUerro9cB8Ry/MO5LWcr2RAwVAnXmtzI2h7Yt4ahgyEFe PCNPXX1mMYiE4FFIgcwoEelFSglK6lNzVUMLo5Z4wSqQ1YJQI+50+3FyFhUIU8EnVqGH VqvA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mailbox.org header.s=mail20150812 header.b=BJxxuTui; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=mailbox.org Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id bd15-20020a056a00278f00b0068fe8cac913si71551pfb.324.2023.09.19.15.20.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Sep 2023 15:20:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@mailbox.org header.s=mail20150812 header.b=BJxxuTui; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=mailbox.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 8512180C2576; Tue, 19 Sep 2023 09:56:36 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231730AbjISQ4e (ORCPT + 99 others); Tue, 19 Sep 2023 12:56:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230162AbjISQ4c (ORCPT ); Tue, 19 Sep 2023 12:56:32 -0400 Received: from mout-p-201.mailbox.org (mout-p-201.mailbox.org [IPv6:2001:67c:2050:0:465::201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9BA818E for ; Tue, 19 Sep 2023 09:56:23 -0700 (PDT) Received: from smtp2.mailbox.org (smtp2.mailbox.org [IPv6:2001:67c:2050:b231:465::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4Rqnql53xvz9sqL; Tue, 19 Sep 2023 18:56:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1695142579; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VMi5+7ZvzTwfMWgziI09KuaClzuCuTi5rZ6FResnfjI=; b=BJxxuTuiJOMSiYUeDmM3bjDc489nXarPKkX2R3CfQvSfuBtti8g2LUBfG15NgiI4Lqtbyg Cj/x79QYZJkSYUyDLJiTaflRpB05kvMqxPApVKK15MdhtqJxQ5JgqiUcUTpvEQ81DgHjEN m46Sr4Y+uRvFYmkuMoIHR2dV6opa8ifzmFpW8CjlntMuy1HrUQ2yK/U9fzS4+EWmWPP3UI mkG92UG6s+e9d7jnRA8fU+u1ZI2EFefQ0JyLgbGMD6vWsWIcD4aBnOE8B8qVYwlgA2jLzN WMRRMCu/NCzGmXDkncE5IJTPrYdI6zNBiFPbfvSejZxaGdwYBka5RLcCHr0bCg== Message-ID: Date: Tue, 19 Sep 2023 18:56:17 +0200 MIME-Version: 1.0 Subject: Re: [PATCH] drm/atomic-helper: prevent uaf in wait_for_vblanks Content-Language: en-CA To: =?UTF-8?Q?Jos=c3=a9_Pekkarinen?= , maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, daniel@ffwll.ch, skhan@linuxfoundation.org Cc: linux-kernel-mentees@lists.linuxfoundation.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org References: <20230918165340.2330-1-jose.pekkarinen@foxhound.fi> From: =?UTF-8?Q?Michel_D=c3=a4nzer?= In-Reply-To: <20230918165340.2330-1-jose.pekkarinen@foxhound.fi> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-MBO-RS-ID: df75b5c6e5d5e56e260 X-MBO-RS-META: k337c4z4wicfa4jjcbc7kusitecbk4nb X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 19 Sep 2023 09:56:36 -0700 (PDT) On 9/18/23 18:53, José Pekkarinen wrote: > Kasan reported the following in my system: > > [ 3935.321003] ================================================================== > [ 3935.321022] BUG: KASAN: slab-use-after-free in drm_atomic_helper_wait_for_vblanks.part.0+0x116/0x450 [drm_kms_helper] > [ 3935.321124] Read of size 1 at addr ffff88818a6f8009 by task kworker/u16:3/5268 > > [ 3935.321124] CPU: 7 PID: 5268 Comm: kworker/u16:3 Not tainted 6.6.0-rc2+ #1 > [ 3935.321124] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 > [ 3935.321124] Workqueue: events_unbound commit_work [drm_kms_helper] > [ 3935.321124] Call Trace: > [ 3935.321124] > [ 3935.321124] dump_stack_lvl+0x43/0x60 > [ 3935.321124] print_report+0xcf/0x660 > [ 3935.321124] ? remove_entity_load_avg+0xdc/0x100 > [ 3935.321124] ? __virt_addr_valid+0xd9/0x160 > [ 3935.321124] ? drm_atomic_helper_wait_for_vblanks.part.0+0x116/0x450 [drm_kms_helper] > [ 3935.321124] kasan_report+0xda/0x110 > [ 3935.321124] ? drm_atomic_helper_wait_for_vblanks.part.0+0x116/0x450 [drm_kms_helper] > [ 3935.321124] drm_atomic_helper_wait_for_vblanks.part.0+0x116/0x450 [drm_kms_helper] > [ 3935.321124] ? __pfx_drm_atomic_helper_wait_for_vblanks.part.0+0x10/0x10 [drm_kms_helper] > [ 3935.321124] ? complete_all+0x48/0x100 > [ 3935.321124] ? _raw_spin_unlock_irqrestore+0x19/0x40 > [ 3935.321124] ? preempt_count_sub+0x14/0xc0 > [ 3935.321124] ? _raw_spin_unlock_irqrestore+0x23/0x40 > [ 3935.321124] ? drm_atomic_helper_commit_hw_done+0x1ac/0x240 [drm_kms_helper] > [ 3935.321124] drm_atomic_helper_commit_tail+0x82/0x90 [drm_kms_helper] > [ 3935.321124] commit_tail+0x15c/0x1d0 [drm_kms_helper] > [ 3935.323185] process_one_work+0x31a/0x610 > [ 3935.323185] worker_thread+0x38e/0x5f0 > [ 3935.323185] ? __pfx_worker_thread+0x10/0x10 > [ 3935.323185] kthread+0x184/0x1c0 > [ 3935.323185] ? __pfx_kthread+0x10/0x10 > [ 3935.323185] ret_from_fork+0x30/0x50 > [ 3935.323185] ? __pfx_kthread+0x10/0x10 > [ 3935.323185] ret_from_fork_asm+0x1b/0x30 > [ 3935.323185] > > [ 3935.323185] Allocated by task 3751: > [ 3935.323185] kasan_save_stack+0x2f/0x50 > [ 3935.323185] kasan_set_track+0x21/0x30 > [ 3935.323185] __kasan_kmalloc+0xa6/0xb0 > [ 3935.323185] drm_atomic_helper_crtc_duplicate_state+0x42/0x70 [drm_kms_helper] > [ 3935.323185] drm_atomic_get_crtc_state+0xc3/0x1e0 [drm] > [ 3935.323185] page_flip_common+0x42/0x160 [drm_kms_helper] > [ 3935.323185] drm_atomic_helper_page_flip+0x6b/0xf0 [drm_kms_helper] > [ 3935.323185] drm_mode_page_flip_ioctl+0x8ad/0x900 [drm] > [ 3935.323185] drm_ioctl_kernel+0x169/0x240 [drm] > [ 3935.323185] drm_ioctl+0x399/0x6b0 [drm] > [ 3935.324772] __x64_sys_ioctl+0xc5/0x100 > [ 3935.324772] do_syscall_64+0x5b/0xc0 > [ 3935.324772] entry_SYSCALL_64_after_hwframe+0x6e/0xd8 > > [ 3935.324772] Freed by task 3751: > [ 3935.324772] kasan_save_stack+0x2f/0x50 > [ 3935.324772] kasan_set_track+0x21/0x30 > [ 3935.324772] kasan_save_free_info+0x27/0x40 > [ 3935.324772] ____kasan_slab_free+0x166/0x1c0 > [ 3935.324772] slab_free_freelist_hook+0x9f/0x1e0 > [ 3935.324772] __kmem_cache_free+0x187/0x2d0 > [ 3935.324772] drm_atomic_state_default_clear+0x226/0x5e0 [drm] > [ 3935.324772] __drm_atomic_state_free+0xc8/0x130 [drm] > [ 3935.324772] drm_atomic_helper_update_plane+0x17d/0x1b0 [drm_kms_helper] > [ 3935.324772] drm_mode_cursor_universal+0x2a4/0x4d0 [drm] > [ 3935.324772] drm_mode_cursor_common+0x1cf/0x430 [drm] > [ 3935.324772] drm_mode_cursor_ioctl+0xc6/0x100 [drm] > [ 3935.326167] drm_ioctl_kernel+0x169/0x240 [drm] > [ 3935.326167] drm_ioctl+0x399/0x6b0 [drm] > [ 3935.326614] __x64_sys_ioctl+0xc5/0x100 > [ 3935.326614] do_syscall_64+0x5b/0xc0 > [ 3935.326614] entry_SYSCALL_64_after_hwframe+0x6e/0xd8 > > [ 3935.326614] The buggy address belongs to the object at ffff88818a6f8000 > which belongs to the cache kmalloc-512 of size 512 > [ 3935.326614] The buggy address is located 9 bytes inside of > freed 512-byte region [ffff88818a6f8000, ffff88818a6f8200) > > [ 3935.326614] The buggy address belongs to the physical page: > [ 3935.326614] page:00000000b0fb0816 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x18a6f8 > [ 3935.326614] head:00000000b0fb0816 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 > [ 3935.326614] anon flags: 0x17ffffc0000840(slab|head|node=0|zone=2|lastcpupid=0x1fffff) > [ 3935.326614] page_type: 0xffffffff() > [ 3935.326614] raw: 0017ffffc0000840 ffff888100042c80 0000000000000000 dead000000000001 > [ 3935.326614] raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000 > [ 3935.326614] page dumped because: kasan: bad access detected > > [ 3935.326614] Memory state around the buggy address: > [ 3935.326614] ffff88818a6f7f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > [ 3935.326614] ffff88818a6f7f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc > [ 3935.326614] >ffff88818a6f8000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > [ 3935.326772] ^ > [ 3935.326772] ffff88818a6f8080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > [ 3935.326772] ffff88818a6f8100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb > [ 3935.326772] ================================================================== > > This suggest there may be some situation where a > struct drm_crtc_state is referenced after already > being freed by drm_atomic_state_default_clear. This > patch will check the new_crtc_state is not null before > using it. > > Signed-off-by: José Pekkarinen > --- > drivers/gpu/drm/drm_atomic_helper.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index 292e38eb6218..cc75d387a542 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -1647,7 +1647,7 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev, > return; > > for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) { > - if (!new_crtc_state->active) > + if (new_crtc_state && !new_crtc_state->active) > continue; > > ret = drm_crtc_vblank_get(crtc); I'm not quite seeing the connection between this change and the KASAN report. If new_crtc_state was NULL, I would have expected a normal NULL pointer dereference oops, not a KASAN report. The KASAN report instead indicates that new_crtc_state isn't NULL, but points to memory which has already been freed. This could be e.g. due to incorrect reference counting somewhere else. -- Earthling Michel Dänzer | https://redhat.com Libre software enthusiast | Mesa and Xwayland developer