[PATCH OLK-5.10 0/2] CVE-2024-57876

Imre Deak (1): drm/dp_mst: Fix resetting msg rx state after topology removal Yongqiang Liu (1): drm/dp_mst: fix kabi broken in struct drm_dp_mst_topology_mgr drivers/gpu/drm/drm_dp_mst_topology.c | 21 +++++++++++++++++++-- include/drm/drm_dp_mst_helper.h | 7 +++++++ 2 files changed, 26 insertions(+), 2 deletions(-) -- 2.34.1

From: Imre Deak <imre.deak@intel.com> mainline inclusion from mainline-v6.13-rc2 commit a6fa67d26de385c3c7a23c1e109a0e23bfda4ec7 category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBJBW7 CVE: CVE-2024-57876 Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i... -------------------------------- If the MST topology is removed during the reception of an MST down reply or MST up request sideband message, the drm_dp_mst_topology_mgr::up_req_recv/down_rep_recv states could be reset from one thread via drm_dp_mst_topology_mgr_set_mst(false), racing with the reading/parsing of the message from another thread via drm_dp_mst_handle_down_rep() or drm_dp_mst_handle_up_req(). The race is possible since the reader/parser doesn't hold any lock while accessing the reception state. This in turn can lead to a memory corruption in the reader/parser as described by commit bd2fccac61b4 ("drm/dp_mst: Fix MST sideband message body length check"). Fix the above by resetting the message reception state if needed before reading/parsing a message. Another solution would be to hold the drm_dp_mst_topology_mgr::lock for the whole duration of the message reception/parsing in drm_dp_mst_handle_down_rep() and drm_dp_mst_handle_up_req(), however this would require a bigger change. Since the fix is also needed for stable, opting for the simpler solution in this patch. Cc: Lyude Paul <lyude@redhat.com> Cc: <stable@vger.kernel.org> Fixes: 1d082618bbf3 ("drm/display/dp_mst: Fix down/up message handling after sink disconnect") Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13056 Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241203160223.2926014-2-imre.... Conflicts: drivers/gpu/drm/drm_dp_mst_topology.c include/drm/drm_dp_mst_helper.h drivers/gpu/drm/display/drm_dp_mst_topology.c include/drm/display/drm_dp_mst_helper.h [Yongqiang: file path changing fix] Signed-off-by: Yongqiang Liu <liuyongqiang13@huawei.com> --- drivers/gpu/drm/drm_dp_mst_topology.c | 21 +++++++++++++++++++-- include/drm/drm_dp_mst_helper.h | 7 +++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index 27305f339881..bb9f2342e96b 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -3770,8 +3770,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms mgr->vcpi_mask = 0; mgr->payload_id_table_cleared = false; - memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv)); - memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv)); + mgr->reset_rx_state = true; } out_unlock: @@ -3901,6 +3900,11 @@ int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr, } EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume); +static void reset_msg_rx_state(struct drm_dp_sideband_msg_rx *msg) +{ + memset(msg, 0, sizeof(*msg)); +} + static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up, struct drm_dp_mst_branch **mstb) @@ -4173,6 +4177,17 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) return 0; } +static void update_msg_rx_state(struct drm_dp_mst_topology_mgr *mgr) +{ + mutex_lock(&mgr->lock); + if (mgr->reset_rx_state) { + mgr->reset_rx_state = false; + reset_msg_rx_state(&mgr->down_rep_recv); + reset_msg_rx_state(&mgr->up_req_recv); + } + mutex_unlock(&mgr->lock); +} + /** * drm_dp_mst_hpd_irq() - MST hotplug IRQ notify * @mgr: manager to notify irq for. @@ -4196,6 +4211,8 @@ int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handl *handled = true; } + update_msg_rx_state(mgr); + if (esi[1] & DP_DOWN_REP_MSG_RDY) { ret = drm_dp_mst_handle_down_rep(mgr); *handled = true; diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index bd1c39907b92..a28e21f5bc31 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -635,6 +635,13 @@ struct drm_dp_mst_topology_mgr { */ bool payload_id_table_cleared : 1; + /** + * @reset_rx_state: The down request's reply and up request message + * receiver state must be reset, after the topology manager got + * removed. Protected by @lock. + */ + bool reset_rx_state : 1; + /** * @mst_primary: Pointer to the primary/first branch device. */ -- 2.34.1

hulk inclusion category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/IBJBW7 CVE: CVE-2024-57876 -------------------------------- Commit a6fa67d26de3 ("drm/dp_mst: Fix resetting msg rx state after topology removal") introduces a new field reset_rx_state in struct drm_dp_mst_topology_mgr which cause KABI breakage. Fix it by using KABI_FILL_HOLE() API when there is only 2bits used in a bool. Fixes: a6fa67d26de3 ("drm/dp_mst: Fix resetting msg rx state after topology removal") Signed-off-by: Yongqiang Liu <liuyongqiang13@huawei.com> --- include/drm/drm_dp_mst_helper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index a28e21f5bc31..b6ea6fe08fb9 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -640,7 +640,7 @@ struct drm_dp_mst_topology_mgr { * receiver state must be reset, after the topology manager got * removed. Protected by @lock. */ - bool reset_rx_state : 1; + KABI_FILL_HOLE(bool reset_rx_state : 1) /** * @mst_primary: Pointer to the primary/first branch device. -- 2.34.1

反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/16424 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/RBG... FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/16424 Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/RBG...
participants (2)
-
patchwork bot
-
Yongqiang Liu