summaryrefslogtreecommitdiffstats
path: root/meta-oe
diff options
context:
space:
mode:
authorAnkur Tyagi <ankur.tyagi85@gmail.com>2026-04-09 19:09:10 +1200
committerAnuj Mittal <anuj.mittal@oss.qualcomm.com>2026-04-13 12:40:21 +0530
commit53ab8b4a5a20eda6524c410a45c6e901b348c455 (patch)
tree8223c4e08ab133533ab9dabb68871c764103d615 /meta-oe
parent2beb2f81e784689dc1e7105a8930309c7e7cfac5 (diff)
downloadmeta-openembedded-53ab8b4a5a20eda6524c410a45c6e901b348c455.tar.gz
freerdp3: fix CVE-2026-24683
Details: https://nvd.nist.gov/vuln/detail/CVE-2026-24683 Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com> Signed-off-by: Anuj Mittal <anuj.mittal@oss.qualcomm.com>
Diffstat (limited to 'meta-oe')
-rw-r--r--meta-oe/recipes-support/freerdp/freerdp3/CVE-2026-24683.patch114
-rw-r--r--meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb1
2 files changed, 115 insertions, 0 deletions
diff --git a/meta-oe/recipes-support/freerdp/freerdp3/CVE-2026-24683.patch b/meta-oe/recipes-support/freerdp/freerdp3/CVE-2026-24683.patch
new file mode 100644
index 0000000000..8d24931b3d
--- /dev/null
+++ b/meta-oe/recipes-support/freerdp/freerdp3/CVE-2026-24683.patch
@@ -0,0 +1,114 @@
1From da05a4039644b0821c0a61806d40688ac08f3ce0 Mon Sep 17 00:00:00 2001
2From: akallabeth <akallabeth@posteo.net>
3Date: Mon, 26 Jan 2026 12:08:48 +0100
4Subject: [PATCH] [channels,ainput] lock context when updating listener
5
6(cherry picked from commit d9ca272dce7a776ab475e9b1a8e8c3d2968c8486)
7
8CVE: CVE-2026-24683
9Upstream-Status: Backport [https://github.com/FreeRDP/FreeRDP/commit/d9ca272dce7a776ab475e9b1a8e8c3d2968c8486]
10Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
11---
12 channels/ainput/client/ainput_main.c | 36 ++++++++++++++++++++--------
13 1 file changed, 26 insertions(+), 10 deletions(-)
14
15diff --git a/channels/ainput/client/ainput_main.c b/channels/ainput/client/ainput_main.c
16index 1a2128dcc..5f66cf90e 100644
17--- a/channels/ainput/client/ainput_main.c
18+++ b/channels/ainput/client/ainput_main.c
19@@ -45,6 +45,7 @@ struct AINPUT_PLUGIN_
20 AInputClientContext* context;
21 UINT32 MajorVersion;
22 UINT32 MinorVersion;
23+ CRITICAL_SECTION lock;
24 };
25
26 /**
27@@ -85,18 +86,15 @@ static UINT ainput_on_data_received(IWTSVirtualChannelCallback* pChannelCallback
28
29 static UINT ainput_send_input_event(AInputClientContext* context, UINT64 flags, INT32 x, INT32 y)
30 {
31- AINPUT_PLUGIN* ainput = NULL;
32- GENERIC_CHANNEL_CALLBACK* callback = NULL;
33 BYTE buffer[32] = { 0 };
34- UINT64 time = 0;
35 wStream sbuffer = { 0 };
36 wStream* s = Stream_StaticInit(&sbuffer, buffer, sizeof(buffer));
37
38 WINPR_ASSERT(s);
39 WINPR_ASSERT(context);
40
41- time = GetTickCount64();
42- ainput = (AINPUT_PLUGIN*)context->handle;
43+ const UINT64 time = GetTickCount64();
44+ AINPUT_PLUGIN* ainput = (AINPUT_PLUGIN*)context->handle;
45 WINPR_ASSERT(ainput);
46
47 if (ainput->MajorVersion != AINPUT_VERSION_MAJOR)
48@@ -105,8 +103,6 @@ static UINT ainput_send_input_event(AInputClientContext* context, UINT64 flags,
49 ainput->MajorVersion, ainput->MinorVersion);
50 return CHANNEL_RC_UNSUPPORTED_VERSION;
51 }
52- callback = ainput->base.listener_callback->channel_callback;
53- WINPR_ASSERT(callback);
54
55 {
56 char ebuffer[128] = { 0 };
57@@ -125,10 +121,15 @@ static UINT ainput_send_input_event(AInputClientContext* context, UINT64 flags,
58 Stream_SealLength(s);
59
60 /* ainput back what we have received. AINPUT does not have any message IDs. */
61+ EnterCriticalSection(&ainput->lock);
62+ GENERIC_CHANNEL_CALLBACK* callback = ainput->base.listener_callback->channel_callback;
63+ WINPR_ASSERT(callback);
64 WINPR_ASSERT(callback->channel);
65 WINPR_ASSERT(callback->channel->Write);
66- return callback->channel->Write(callback->channel, (ULONG)Stream_Length(s), Stream_Buffer(s),
67- NULL);
68+ const UINT rc = callback->channel->Write(callback->channel, (ULONG)Stream_Length(s),
69+ Stream_Buffer(s), NULL);
70+ LeaveCriticalSection(&ainput->lock);
71+ return rc;
72 }
73
74 /**
75@@ -140,8 +141,16 @@ static UINT ainput_on_close(IWTSVirtualChannelCallback* pChannelCallback)
76 {
77 GENERIC_CHANNEL_CALLBACK* callback = (GENERIC_CHANNEL_CALLBACK*)pChannelCallback;
78
79- free(callback);
80+ if (callback)
81+ {
82+ AINPUT_PLUGIN* ainput = (AINPUT_PLUGIN*)callback->plugin;
83+ WINPR_ASSERT(ainput);
84
85+ /* Lock here to ensure that no ainput_send_input_event is in progress. */
86+ EnterCriticalSection(&ainput->lock);
87+ free(callback);
88+ LeaveCriticalSection(&ainput->lock);
89+ }
90 return CHANNEL_RC_OK;
91 }
92
93@@ -155,14 +164,21 @@ static UINT init_plugin_cb(GENERIC_DYNVC_PLUGIN* base, rdpContext* rcontext, rdp
94 context->handle = (void*)base;
95 context->AInputSendInputEvent = ainput_send_input_event;
96
97+ InitializeCriticalSection(&ainput->lock);
98+
99+ EnterCriticalSection(&ainput->lock);
100 ainput->context = context;
101 ainput->base.iface.pInterface = context;
102+ LeaveCriticalSection(&ainput->lock);
103 return CHANNEL_RC_OK;
104 }
105
106 static void terminate_plugin_cb(GENERIC_DYNVC_PLUGIN* base)
107 {
108 AINPUT_PLUGIN* ainput = (AINPUT_PLUGIN*)base;
109+ WINPR_ASSERT(ainput);
110+
111+ DeleteCriticalSection(&ainput->lock);
112 free(ainput->context);
113 }
114
diff --git a/meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb b/meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb
index 8e53c47103..715354768a 100644
--- a/meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb
+++ b/meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb
@@ -30,6 +30,7 @@ SRC_URI = "git://github.com/FreeRDP/FreeRDP.git;branch=master;protocol=https \
30 file://CVE-2026-24680_CVE-2026-27950.patch \ 30 file://CVE-2026-24680_CVE-2026-27950.patch \
31 file://CVE-2026-24681.patch \ 31 file://CVE-2026-24681.patch \
32 file://CVE-2026-24682.patch \ 32 file://CVE-2026-24682.patch \
33 file://CVE-2026-24683.patch \
33 " 34 "
34 35
35S = "${WORKDIR}/git" 36S = "${WORKDIR}/git"