[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] registry: Fix wrong truncation of Unicode.Length


  • To: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Wed, 26 Aug 2026 08:26:05 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QQSiWJLNSLf+kbOk+Zto2Nnsgw1hMSDoNupEWpoXcNk=; b=m4e+V8wh+sPetrN/ZUep/v0cEqHwdyhEsId3Cnljg9U235mpUUm+aFUnB0jNr+DaxJVH+IgxHSy+oPsymcoEUUDP/7LoZjLq9NHflxOhDFAhpxh8Pepz9khNVdvLTSPBZgCdT5XMX8K3M9Pe6DRTrZZFnT+cAQd5IqfQwSsvhNnCxkVYpVgB774q08PtqZlqRXg+Ltb194U4PCVyuiTFPf8ss0KHXYdLKixzBh+Bjv212ZT3CX8FTKtB7+mmmvCBjX38K1RPcddZ92Jd+Vte8vmr3fp9Vl4zJYkinK+gX7w8Vw2bo0Ysv09FMdXObJEhe5RMHUWTG4IcQbLxHPnIlw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ug/0EpJO5bHcKDHqkMoC85x2qeEvQwYz8CRtiPd0l6ckAIJC9Hwwi1/BnuYJJjyswl9I6jAq4O5w0T2ZQ/iM2kX3YeH+F9n/95oYIdW6lLkp8GbGxcrI2dX3RGCxjL4HdKJ/Er1m1+h/4jxFhcdKTWS6e9rbG0eAQ5CpSlrII4BiLkpijyZfxB+6TUbKheKfqYyCspBh05TpELRfD7p4K+lgJXpAzys6weDLm3MCBBJiCB8dGMYLAG5HDWkvd20zEZYRSXu3d9HeDlsRdbr10Aopf1s7P9zJY4/COu9LUPdMear58IIOfkB3IvyzLHUe9F4RiB6fiChE3Sshmqk3OQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Delivery-date: Wed, 26 Aug 2026 08:26:13 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHdNNTg/k3RmxEXQk2eLFKvXyKqCLavQFeAgAC+98c=
  • Thread-topic: [PATCH] registry: Fix wrong truncation of Unicode.Length

This set of patches all
Reviewed-by: Owen Smith <owen.smith@xxxxxxxxxx>

________________________________________
From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
Sent: 25 August 2026 10:02 PM
To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Cc: Tu Dinh; Owen Smith
Subject: [PATCH] registry: Fix wrong truncation of Unicode.Length

Assisted-by: ClaudeCode:claude-opus-4.8
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>

Ported from XenBus.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 src/xenvkbd/registry.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/xenvkbd/registry.c b/src/xenvkbd/registry.c
index 8f84818..e498497 100644
--- a/src/xenvkbd/registry.c
+++ b/src/xenvkbd/registry.c
@@ -1305,30 +1305,37 @@ RegistryAnsiToSz(
     NTSTATUS                        status;

     Length = Ansi->Length + 1;
+
+    status = STATUS_BUFFER_OVERFLOW;
+    if (Length * sizeof(WCHAR) > MAXUSHORT)
+        goto fail1;
+
     Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, 
Data) +
                                  Length * sizeof (WCHAR));

     status = STATUS_NO_MEMORY;
     if (Partial == NULL)
-        goto fail1;
+        goto fail2;

     Partial->TitleIndex = 0;
     Partial->Type = REG_SZ;
     Partial->DataLength = Length * sizeof (WCHAR);

-    Unicode.MaximumLength = (UCHAR)Partial->DataLength;
+    Unicode.MaximumLength = (USHORT)Partial->DataLength;
     Unicode.Buffer = (PWCHAR)Partial->Data;
     Unicode.Length = 0;

     status = RtlAnsiStringToUnicodeString(&Unicode, Ansi, FALSE);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;

     return Partial;

-fail2:
+fail3:
     __RegistryFree(Partial);

+fail2:
+
 fail1:
     return NULL;
 }
@@ -1348,12 +1355,16 @@ RegistryAnsiToMultiSz(
     for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
         Length += Ansi[Index].Length + 1;

+    status = STATUS_BUFFER_OVERFLOW;
+    if (Length * sizeof(WCHAR) > MAXUSHORT)
+        goto fail1;
+
     Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, 
Data) +
                                Length * sizeof (WCHAR));

     status = STATUS_NO_MEMORY;
     if (Partial == NULL)
-        goto fail1;
+        goto fail2;

     Partial->TitleIndex = 0;
     Partial->Type = REG_MULTI_SZ;
@@ -1366,7 +1377,7 @@ RegistryAnsiToMultiSz(
     for (Index = 0; Ansi[Index].Buffer != NULL; Index++) {
         status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi[Index], FALSE);
         if (!NT_SUCCESS(status))
-            goto fail2;
+            goto fail3;

         Length = Unicode.Length / sizeof (WCHAR);

@@ -1379,9 +1390,11 @@ RegistryAnsiToMultiSz(

     return Partial;

-fail2:
+fail3:
     __RegistryFree(Partial);

+fail2:
+
 fail1:
     return NULL;
 }
--
2.55.0.windows.3



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.