Fixed wrong string length calculation in RtlAppendUnicodeToString().

svn path=/trunk/; revision=2615
This commit is contained in:
Eric Kohl 2002-02-09 23:29:50 +00:00
parent 0fdb820f0b
commit 0ce194ac1a
2 changed files with 235 additions and 294 deletions

View file

@ -1,4 +1,4 @@
/* $Id: unicode.c,v 1.18 2001/03/01 15:30:36 ekohl Exp $ /* $Id: unicode.c,v 1.19 2002/02/09 23:29:50 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -206,37 +206,34 @@ RtlAppendUnicodeStringToString (
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination,
RtlAppendUnicodeToString ( IN PWSTR Source)
IN OUT PUNICODE_STRING Destination,
IN PWSTR Source
)
{ {
PWCHAR Src; PWCHAR Src;
PWCHAR Dest; PWCHAR Dest;
ULONG i; ULONG i;
ULONG slen; ULONG slen;
slen = wcslen (Source); slen = wcslen(Source) * sizeof(WCHAR);
if (Destination->Length + slen >= Destination->MaximumLength) if (Destination->Length + slen >= Destination->MaximumLength)
return STATUS_BUFFER_TOO_SMALL; return(STATUS_BUFFER_TOO_SMALL);
Src = Source; Src = Source;
Dest = Destination->Buffer + (Destination->Length / sizeof (WCHAR)); Dest = Destination->Buffer + (Destination->Length / sizeof(WCHAR));
for (i = 0; i < slen; i++) for (i = 0; i < (slen / sizeof(WCHAR)); i++)
{ {
*Dest = *Src; *Dest = *Src;
Dest++; Dest++;
Src++; Src++;
} }
*Dest = 0; *Dest = 0;
Destination->Length += (slen * sizeof(WCHAR)); Destination->Length += slen;
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }

View file

@ -1,4 +1,4 @@
/* $Id: unicode.c,v 1.19 2001/11/02 09:10:49 ekohl Exp $ /* $Id: unicode.c,v 1.20 2002/02/09 23:29:12 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -27,47 +27,43 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
WCHAR STDCALL WCHAR STDCALL
RtlAnsiCharToUnicodeChar(CHAR AnsiChar) RtlAnsiCharToUnicodeChar(IN CHAR AnsiChar)
{ {
ULONG Size; ULONG Size;
WCHAR UnicodeChar; WCHAR UnicodeChar;
Size = 1; Size = 1;
#if 0 #if 0
Size = (NlsLeadByteInfo[AnsiChar] == 0) ? 1 : 2; Size = (NlsLeadByteInfo[AnsiChar] == 0) ? 1 : 2;
#endif #endif
RtlMultiByteToUnicodeN (&UnicodeChar, RtlMultiByteToUnicodeN(&UnicodeChar,
sizeof(WCHAR), sizeof(WCHAR),
NULL, NULL,
&AnsiChar, &AnsiChar,
Size); Size);
return UnicodeChar; return(UnicodeChar);
} }
ULONG ULONG STDCALL
STDCALL RtlAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString)
RtlAnsiStringToUnicodeSize(PANSI_STRING AnsiString)
{ {
ULONG Size; ULONG Size;
RtlMultiByteToUnicodeSize (&Size, RtlMultiByteToUnicodeSize(&Size,
AnsiString->Buffer, AnsiString->Buffer,
AnsiString->Length); AnsiString->Length);
return Size; return(Size);
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAnsiStringToUnicodeString(IN OUT PUNICODE_STRING DestinationString,
RtlAnsiStringToUnicodeString ( IN PANSI_STRING SourceString,
PUNICODE_STRING DestinationString, IN BOOLEAN AllocateDestinationString)
PANSI_STRING SourceString,
BOOLEAN AllocateDestinationString
)
{ {
NTSTATUS Status; NTSTATUS Status;
ULONG Length; ULONG Length;
@ -118,12 +114,9 @@ RtlAnsiStringToUnicodeString (
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAppendAsciizToString(IN OUT PSTRING Destination,
RtlAppendAsciizToString ( IN PCSZ Source)
IN OUT PSTRING Destination,
IN PCSZ Source
)
{ {
ULONG Length; ULONG Length;
PCHAR Ptr; PCHAR Ptr;
@ -148,40 +141,34 @@ RtlAppendAsciizToString (
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAppendStringToString(IN OUT PSTRING Destination,
RtlAppendStringToString ( IN PSTRING Source)
PSTRING Destination,
PSTRING Source
)
{ {
PCHAR Ptr; PCHAR Ptr;
if (Source->Length == 0) if (Source->Length == 0)
return STATUS_SUCCESS; return(STATUS_SUCCESS);
if (Destination->Length + Source->Length >= Destination->MaximumLength) if (Destination->Length + Source->Length >= Destination->MaximumLength)
return STATUS_BUFFER_TOO_SMALL; return(STATUS_BUFFER_TOO_SMALL);
Ptr = Destination->Buffer + Destination->Length; Ptr = Destination->Buffer + Destination->Length;
memmove (Ptr, memmove(Ptr,
Source->Buffer, Source->Buffer,
Source->Length); Source->Length);
Ptr += Source->Length; Ptr += Source->Length;
*Ptr = 0; *Ptr = 0;
Destination->Length += Source->Length; Destination->Length += Source->Length;
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAppendUnicodeStringToString(IN OUT PUNICODE_STRING Destination,
RtlAppendUnicodeStringToString ( IN PUNICODE_STRING Source)
IN OUT PUNICODE_STRING Destination,
IN PUNICODE_STRING Source
)
{ {
PWCHAR Src, Dest; PWCHAR Src, Dest;
ULONG i; ULONG i;
@ -205,85 +192,80 @@ RtlAppendUnicodeStringToString (
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination,
RtlAppendUnicodeToString ( IN PWSTR Source)
IN OUT PUNICODE_STRING Destination,
IN PWSTR Source
)
{ {
PWCHAR Src; PWCHAR Src;
PWCHAR Dest; PWCHAR Dest;
ULONG i; ULONG i;
ULONG slen; ULONG slen;
slen = wcslen (Source); slen = wcslen(Source) * sizeof(WCHAR);
if (Destination->Length + slen >= Destination->MaximumLength) if (Destination->Length + slen >= Destination->MaximumLength)
return STATUS_BUFFER_TOO_SMALL; return(STATUS_BUFFER_TOO_SMALL);
Src = Source; Src = Source;
Dest = Destination->Buffer + (Destination->Length / sizeof (WCHAR)); Dest = Destination->Buffer + (Destination->Length / sizeof(WCHAR));
for (i = 0; i < slen; i++) for (i = 0; i < (slen / sizeof(WCHAR)); i++)
{ {
*Dest = *Src; *Dest = *Src;
Dest++; Dest++;
Src++; Src++;
} }
*Dest = 0; *Dest = 0;
Destination->Length += (slen * sizeof(WCHAR)); Destination->Length += slen;
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }
NTSTATUS NTSTATUS STDCALL
STDCALL RtlCharToInteger(IN PCSZ String,
RtlCharToInteger(IN PCSZ String, IN ULONG Base, IN OUT PULONG Value) IN ULONG Base,
IN OUT PULONG Value)
{ {
ULONG Val; ULONG Val;
*Value = 0; *Value = 0;
if (Base == 0) if (Base == 0)
{
Base = 10;
if (*String == '0')
{ {
Base = 10; Base = 8;
if (*String == '0') String++;
{ if ((*String == 'x') && isxdigit (String[1]))
Base = 8; {
String++; String++;
if ((*String == 'x') && isxdigit (String[1])) Base = 16;
{ }
String++;
Base = 16;
}
}
} }
}
if (!isxdigit (*String)) if (!isxdigit (*String))
return STATUS_INVALID_PARAMETER; return(STATUS_INVALID_PARAMETER);
while (isxdigit (*String) && while (isxdigit (*String) &&
(Val = isdigit (*String) ? * String - '0' : (islower (*String) (Val = isdigit (*String) ? * String - '0' : (islower (*String)
? toupper (*String) : *String) - 'A' + 10) < Base) ? toupper (*String) : *String) - 'A' + 10) < Base)
{ {
*Value = *Value * Base + Val; *Value = *Value * Base + Val;
String++; String++;
} }
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }
LONG LONG STDCALL
STDCALL RtlCompareString(IN PSTRING String1,
RtlCompareString ( IN PSTRING String2,
IN PSTRING String1, IN BOOLEAN CaseInsensitive)
IN PSTRING String2,
IN BOOLEAN CaseInsensitive
)
{ {
ULONG len1, len2; ULONG len1, len2;
PCHAR s1, s2; PCHAR s1, s2;
@ -325,13 +307,10 @@ RtlCompareString (
} }
LONG LONG STDCALL
STDCALL RtlCompareUnicodeString(IN PUNICODE_STRING String1,
RtlCompareUnicodeString ( IN PUNICODE_STRING String2,
IN PUNICODE_STRING String1, IN BOOLEAN CaseInsensitive)
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInsensitive
)
{ {
ULONG len1, len2; ULONG len1, len2;
PWCHAR s1, s2; PWCHAR s1, s2;
@ -373,12 +352,9 @@ RtlCompareUnicodeString (
} }
VOID VOID STDCALL
STDCALL RtlCopyString(IN OUT PSTRING DestinationString,
RtlCopyString ( IN PSTRING SourceString)
IN OUT PSTRING DestinationString,
IN PSTRING SourceString
)
{ {
ULONG copylen, i; ULONG copylen, i;
PCHAR Src, Dest; PCHAR Src, Dest;
@ -406,12 +382,9 @@ RtlCopyString (
} }
VOID VOID STDCALL
STDCALL RtlCopyUnicodeString(IN OUT PUNICODE_STRING DestinationString,
RtlCopyUnicodeString ( IN PUNICODE_STRING SourceString)
IN OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString
)
{ {
ULONG copylen, i; ULONG copylen, i;
PWCHAR Src, Dest; PWCHAR Src, Dest;
@ -439,12 +412,9 @@ RtlCopyUnicodeString (
} }
BOOLEAN BOOLEAN STDCALL
STDCALL RtlCreateUnicodeString(IN OUT PUNICODE_STRING Destination,
RtlCreateUnicodeString ( IN PWSTR Source)
IN OUT PUNICODE_STRING Destination,
IN PWSTR Source
)
{ {
ULONG Length; ULONG Length;
@ -467,31 +437,28 @@ RtlCreateUnicodeString (
} }
BOOLEAN BOOLEAN STDCALL
STDCALL RtlCreateUnicodeStringFromAsciiz(IN OUT PUNICODE_STRING Destination,
RtlCreateUnicodeStringFromAsciiz ( IN PCSZ Source)
IN OUT PUNICODE_STRING Destination,
IN PCSZ Source
)
{ {
ANSI_STRING AnsiString; ANSI_STRING AnsiString;
NTSTATUS Status; NTSTATUS Status;
RtlInitAnsiString (&AnsiString, RtlInitAnsiString(&AnsiString,
Source); Source);
Status = RtlAnsiStringToUnicodeString (Destination, Status = RtlAnsiStringToUnicodeString(Destination,
&AnsiString, &AnsiString,
TRUE); TRUE);
return NT_SUCCESS(Status); return(NT_SUCCESS(Status));
} }
NTSTATUS STDCALL NTSTATUS STDCALL
RtlDowncaseUnicodeString (IN OUT PUNICODE_STRING DestinationString, RtlDowncaseUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString) IN BOOLEAN AllocateDestinationString)
{ {
ULONG i; ULONG i;
PWCHAR Src, Dest; PWCHAR Src, Dest;
@ -540,13 +507,10 @@ RtlDowncaseUnicodeString (IN OUT PUNICODE_STRING DestinationString,
} }
BOOLEAN BOOLEAN STDCALL
STDCALL RtlEqualString(IN PSTRING String1,
RtlEqualString ( IN PSTRING String2,
IN PSTRING String1, IN BOOLEAN CaseInsensitive)
IN PSTRING String2,
IN BOOLEAN CaseInsensitive
)
{ {
unsigned long s1l=String1->Length; unsigned long s1l=String1->Length;
unsigned long s2l=String2->Length; unsigned long s2l=String2->Length;
@ -585,13 +549,10 @@ RtlEqualString (
} }
BOOLEAN BOOLEAN STDCALL
STDCALL RtlEqualUnicodeString(IN PUNICODE_STRING String1,
RtlEqualUnicodeString ( IN PUNICODE_STRING String2,
IN PUNICODE_STRING String1, IN BOOLEAN CaseInsensitive)
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInsensitive
)
{ {
unsigned long s1l = String1->Length / sizeof(WCHAR); unsigned long s1l = String1->Length / sizeof(WCHAR);
unsigned long s2l = String2->Length / sizeof(WCHAR); unsigned long s2l = String2->Length / sizeof(WCHAR);
@ -629,11 +590,8 @@ RtlEqualUnicodeString (
} }
VOID VOID STDCALL
STDCALL RtlFreeAnsiString(IN PANSI_STRING AnsiString)
RtlFreeAnsiString (
IN PANSI_STRING AnsiString
)
{ {
if (AnsiString->Buffer == NULL) if (AnsiString->Buffer == NULL)
return; return;
@ -646,11 +604,8 @@ RtlFreeAnsiString (
} }
VOID VOID STDCALL
STDCALL RtlFreeOemString(IN POEM_STRING OemString)
RtlFreeOemString (
IN POEM_STRING OemString
)
{ {
if (OemString->Buffer == NULL) if (OemString->Buffer == NULL)
return; return;
@ -663,11 +618,8 @@ RtlFreeOemString (
} }
VOID VOID STDCALL
STDCALL RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString)
RtlFreeUnicodeString (
IN PUNICODE_STRING UnicodeString
)
{ {
if (UnicodeString->Buffer == NULL) if (UnicodeString->Buffer == NULL)
return; return;
@ -680,12 +632,9 @@ RtlFreeUnicodeString (
} }
VOID VOID STDCALL
STDCALL RtlInitAnsiString(IN OUT PANSI_STRING DestinationString,
RtlInitAnsiString ( IN PCSZ SourceString)
IN OUT PANSI_STRING DestinationString,
IN PCSZ SourceString
)
{ {
ULONG DestSize; ULONG DestSize;
@ -705,10 +654,8 @@ RtlInitAnsiString (
VOID STDCALL VOID STDCALL
RtlInitString ( RtlInitString(IN OUT PSTRING DestinationString,
IN OUT PSTRING DestinationString, IN PCSZ SourceString)
IN PCSZ SourceString
)
{ {
ULONG DestSize; ULONG DestSize;
@ -728,10 +675,8 @@ RtlInitString (
VOID STDCALL VOID STDCALL
RtlInitUnicodeString ( RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString)
IN PCWSTR SourceString
)
{ {
ULONG DestSize; ULONG DestSize;
@ -755,12 +700,10 @@ RtlInitUnicodeString (
NTSTATUS STDCALL NTSTATUS STDCALL
RtlIntegerToChar ( RtlIntegerToChar(IN ULONG Value,
IN ULONG Value, IN ULONG Base,
IN ULONG Base, IN ULONG Length,
IN ULONG Length, IN OUT PCHAR String)
IN OUT PCHAR String
)
{ {
ULONG Radix; ULONG Radix;
CHAR temp[33]; CHAR temp[33];
@ -1421,28 +1364,28 @@ RtlUpcaseUnicodeStringToCountedOemString(IN OUT POEM_STRING DestinationString,
NTSTATUS Status; NTSTATUS Status;
ULONG Length; ULONG Length;
ULONG Size; ULONG Size;
if (NlsMbCodePageTag == TRUE) if (NlsMbCodePageTag == TRUE)
Length = RtlUnicodeStringToAnsiSize (SourceString) + 1; Length = RtlUnicodeStringToAnsiSize (SourceString) + 1;
else else
Length = SourceString->Length / sizeof(WCHAR) + 1; Length = SourceString->Length / sizeof(WCHAR) + 1;
if (Length > 0x0000FFFF) if (Length > 0x0000FFFF)
return STATUS_INVALID_PARAMETER_2; return(STATUS_INVALID_PARAMETER_2);
DestinationString->Length = (WORD)(Length - 1); DestinationString->Length = (WORD)(Length - 1);
if (AllocateDestinationString == TRUE) if (AllocateDestinationString == TRUE)
{ {
DestinationString->Buffer = ExAllocatePoolWithTag (NonPagedPool, DestinationString->Buffer =
Length, ExAllocatePoolWithTag(NonPagedPool,
TAG_OSTR); Length,
TAG_OSTR);
if (DestinationString->Buffer == NULL) if (DestinationString->Buffer == NULL)
return STATUS_NO_MEMORY; return(STATUS_NO_MEMORY);
RtlZeroMemory (DestinationString->Buffer, RtlZeroMemory(DestinationString->Buffer,
Length); Length);
DestinationString->MaximumLength = (WORD)Length; DestinationString->MaximumLength = (WORD)Length;
} }
else else
@ -1450,28 +1393,27 @@ RtlUpcaseUnicodeStringToCountedOemString(IN OUT POEM_STRING DestinationString,
if (Length > DestinationString->MaximumLength) if (Length > DestinationString->MaximumLength)
{ {
if (DestinationString->MaximumLength == 0) if (DestinationString->MaximumLength == 0)
return STATUS_BUFFER_OVERFLOW; return(STATUS_BUFFER_OVERFLOW);
DestinationString->Length = DestinationString->Length =
DestinationString->MaximumLength - 1; DestinationString->MaximumLength - 1;
} }
} }
Status = RtlUpcaseUnicodeToOemN (DestinationString->Buffer, Status = RtlUpcaseUnicodeToOemN(DestinationString->Buffer,
DestinationString->Length, DestinationString->Length,
&Size, &Size,
SourceString->Buffer, SourceString->Buffer,
SourceString->Length); SourceString->Length);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
if (AllocateDestinationString) if (AllocateDestinationString)
ExFreePool (DestinationString->Buffer); ExFreePool(DestinationString->Buffer);
return(Status);
return Status;
} }
DestinationString->Buffer[Size] = 0; DestinationString->Buffer[Size] = 0;
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }
@ -1480,47 +1422,49 @@ RtlUpcaseUnicodeStringToOemString(IN OUT POEM_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,
IN BOOLEAN AllocateDestinationString) IN BOOLEAN AllocateDestinationString)
{ {
NTSTATUS Status; NTSTATUS Status;
ULONG Length; ULONG Length;
if (NlsMbOemCodePageTag == TRUE) if (NlsMbOemCodePageTag == TRUE)
Length = RtlUnicodeStringToAnsiSize (SourceString); Length = RtlUnicodeStringToOemSize(SourceString);
else else
Length = SourceString->Length / sizeof(WCHAR); Length = SourceString->Length / sizeof(WCHAR);
if (AllocateDestinationString == TRUE) if (AllocateDestinationString == TRUE)
{ {
DestinationString->MaximumLength = Length + sizeof(CHAR); DestinationString->MaximumLength = Length + sizeof(CHAR);
DestinationString->Buffer = ExAllocatePoolWithTag (NonPagedPool, DestinationString->Buffer =
DestinationString->MaximumLength, TAG_OSTR); ExAllocatePoolWithTag(NonPagedPool,
if (DestinationString->Buffer == NULL) DestinationString->MaximumLength,
return STATUS_NO_MEMORY; TAG_OSTR);
} if (DestinationString->Buffer == NULL)
else return(STATUS_NO_MEMORY);
{ }
if (Length >= DestinationString->MaximumLength) else
return STATUS_BUFFER_TOO_SMALL; {
} if (Length >= DestinationString->MaximumLength)
DestinationString->Length = Length; return(STATUS_BUFFER_TOO_SMALL);
}
DestinationString->Length = Length;
RtlZeroMemory (DestinationString->Buffer, RtlZeroMemory(DestinationString->Buffer,
DestinationString->Length); DestinationString->Length);
Status = RtlUpcaseUnicodeToOemN (DestinationString->Buffer, Status = RtlUpcaseUnicodeToOemN(DestinationString->Buffer,
DestinationString->Length, DestinationString->Length,
NULL, NULL,
SourceString->Buffer, SourceString->Buffer,
SourceString->Length); SourceString->Length);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
if (AllocateDestinationString) if (AllocateDestinationString)
ExFreePool (DestinationString->Buffer); ExFreePool(DestinationString->Buffer);
return Status; return(Status);
} }
DestinationString->Buffer[Length] = 0; DestinationString->Buffer[Length] = 0;
return STATUS_SUCCESS; return(STATUS_SUCCESS);
} }
@ -1595,7 +1539,7 @@ RtlxAnsiStringToUnicodeSize(IN PANSI_STRING AnsiString)
ULONG STDCALL ULONG STDCALL
RtlxOemStringToUnicodeSize(IN POEM_STRING OemString) RtlxOemStringToUnicodeSize(IN POEM_STRING OemString)
{ {
return(RtlAnsiStringToUnicodeSize((PANSI_STRING)OemString)); return(RtlOemStringToUnicodeSize((PANSI_STRING)OemString));
} }
@ -1609,7 +1553,7 @@ RtlxUnicodeStringToAnsiSize(IN PUNICODE_STRING UnicodeString)
ULONG STDCALL ULONG STDCALL
RtlxUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString) RtlxUnicodeStringToOemSize(IN PUNICODE_STRING UnicodeString)
{ {
return(RtlUnicodeStringToAnsiSize(UnicodeString)); return(RtlUnicodeStringToOemSize(UnicodeString));
} }
/* EOF */ /* EOF */