diff options
| author | Ankur Tyagi <ankur.tyagi85@gmail.com> | 2026-04-09 19:09:10 +1200 |
|---|---|---|
| committer | Anuj Mittal <anuj.mittal@oss.qualcomm.com> | 2026-04-13 12:40:21 +0530 |
| commit | 53ab8b4a5a20eda6524c410a45c6e901b348c455 (patch) | |
| tree | 8223c4e08ab133533ab9dabb68871c764103d615 /meta-oe | |
| parent | 2beb2f81e784689dc1e7105a8930309c7e7cfac5 (diff) | |
| download | meta-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.patch | 114 | ||||
| -rw-r--r-- | meta-oe/recipes-support/freerdp/freerdp3_3.4.0.bb | 1 |
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 @@ | |||
| 1 | From da05a4039644b0821c0a61806d40688ac08f3ce0 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: akallabeth <akallabeth@posteo.net> | ||
| 3 | Date: Mon, 26 Jan 2026 12:08:48 +0100 | ||
| 4 | Subject: [PATCH] [channels,ainput] lock context when updating listener | ||
| 5 | |||
| 6 | (cherry picked from commit d9ca272dce7a776ab475e9b1a8e8c3d2968c8486) | ||
| 7 | |||
| 8 | CVE: CVE-2026-24683 | ||
| 9 | Upstream-Status: Backport [https://github.com/FreeRDP/FreeRDP/commit/d9ca272dce7a776ab475e9b1a8e8c3d2968c8486] | ||
| 10 | Signed-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 | |||
| 15 | diff --git a/channels/ainput/client/ainput_main.c b/channels/ainput/client/ainput_main.c | ||
| 16 | index 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 | ||
| 35 | S = "${WORKDIR}/git" | 36 | S = "${WORKDIR}/git" |
