Author: tfaber
Date: Sun Nov 24 20:04:45 2013
New Revision: 61093
URL:
http://svn.reactos.org/svn/reactos?rev=61093&view=rev
Log:
[RTL]
- Allow parsing manifest files larger than 32 kB. Fix a DPRINT. Patch by David Quintana.
CORE-7642 #resolve
Modified:
trunk/reactos/lib/rtl/actctx.c
Modified: trunk/reactos/lib/rtl/actctx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/actctx.c?rev=61093…
==============================================================================
--- trunk/reactos/lib/rtl/actctx.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/actctx.c [iso-8859-1] Sun Nov 24 20:04:45 2013
@@ -1176,6 +1176,7 @@
struct assembly* assembly)
{
xmlstr_t attr_name, attr_value;
+ UNICODE_STRING attr_nameU, attr_valueU;
BOOL end = FALSE, error;
struct entity* entity;
@@ -1194,7 +1195,9 @@
}
else
{
- DPRINT1("unknown attr %S=%S\n", attr_name.ptr, attr_value.ptr);
+ attr_nameU = xmlstr2unicode(&attr_name);
+ attr_valueU = xmlstr2unicode(&attr_value);
+ DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU,
&attr_valueU);
}
}
@@ -1658,36 +1661,31 @@
else
{
/* TODO: this doesn't handle arbitrary encodings */
- ANSI_STRING xmlA;
- UNICODE_STRING xmlW;
-
- ASSERT(size < MAXUSHORT);
- xmlA.Buffer = (PCHAR)buffer;
- xmlA.Length = xmlA.MaximumLength = (USHORT)size;
-
- _SEH2_TRY
- {
- status = RtlAnsiStringToUnicodeString(&xmlW, &xmlA, TRUE);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- DPRINT1("Exception accessing buffer\n");
- _SEH2_YIELD(return STATUS_SXS_CANT_GEN_ACTCTX);
- }
- _SEH2_END;
-
+ WCHAR *new_buff;
+ ULONG sizeU;
+
+ status = RtlMultiByteToUnicodeSize(&sizeU, buffer, size);
if (!NT_SUCCESS(status))
{
- DPRINT1("RtlAnsiStringToUnicodeString failed with %lx\n", status);
+ DPRINT1("RtlMultiByteToUnicodeSize failed with %lx\n", status);
return STATUS_SXS_CANT_GEN_ACTCTX;
}
- ASSERT(xmlW.Buffer != NULL);
-
- xmlbuf.ptr = xmlW.Buffer;
- xmlbuf.end = xmlbuf.ptr + xmlW.Length / sizeof(WCHAR);
- status = parse_manifest_buffer( acl, assembly, ai, &xmlbuf );
-
- RtlFreeUnicodeString(&xmlW);
+
+ new_buff = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeU);
+ if (!new_buff)
+ return STATUS_NO_MEMORY;
+
+ status = RtlMultiByteToUnicodeN(new_buff, sizeU, &sizeU, buffer, size);
+ if (!NT_SUCCESS(status))
+ {
+ DPRINT1("RtlMultiByteToUnicodeN failed with %lx\n", status);
+ return STATUS_SXS_CANT_GEN_ACTCTX;
+ }
+
+ xmlbuf.ptr = new_buff;
+ xmlbuf.end = xmlbuf.ptr + sizeU / sizeof(WCHAR);
+ status = parse_manifest_buffer(acl, assembly, ai, &xmlbuf);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, new_buff);
}
return status;
}