Index: lib/kernel32/file/curdir.c =================================================================== --- lib/kernel32/file/curdir.c (revision 13231) +++ lib/kernel32/file/curdir.c (working copy) @@ -37,6 +37,7 @@ { ANSI_STRING AnsiString; UNICODE_STRING UnicodeString; + ULONG Length; /* allocate buffer for unicode string */ UnicodeString.Length = 0; @@ -59,30 +60,42 @@ /* get current directory */ UnicodeString.Length = RtlGetCurrentDirectory_U (UnicodeString.MaximumLength, UnicodeString.Buffer); - if (nBufferLength > 0) + DPRINT("UnicodeString.Buffer %wZ\n", &UnicodeString); + + /* convert unicode string to ansi (or oem) */ + if (bIsFileApiAnsi) { - DPRINT("UnicodeString.Buffer %wZ\n", &UnicodeString); + if ((Length = RtlUnicodeStringToAnsiSize (&UnicodeString)) > + nBufferLength) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + UnicodeString.Buffer); + return Length-1; + } + RtlUnicodeStringToAnsiString (&AnsiString, + &UnicodeString, + FALSE); + } else { + if ((Length = RtlUnicodeStringToOemSize (&UnicodeString)) > + nBufferLength) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + UnicodeString.Buffer); + return Length-1; + } + RtlUnicodeStringToOemString (&AnsiString, + &UnicodeString, + FALSE); + } + DPRINT("AnsiString.Buffer %s\n", AnsiString.Buffer); - /* convert unicode string to ansi (or oem) */ - if (bIsFileApiAnsi) - RtlUnicodeStringToAnsiString (&AnsiString, - &UnicodeString, - FALSE); - else - RtlUnicodeStringToOemString (&AnsiString, - &UnicodeString, - FALSE); - DPRINT("AnsiString.Buffer %s\n", AnsiString.Buffer); + /* free unicode string */ + RtlFreeHeap (RtlGetProcessHeap (), + 0, + UnicodeString.Buffer); - /* free unicode string */ - RtlFreeHeap (RtlGetProcessHeap (), - 0, - UnicodeString.Buffer); - } - else - { - AnsiString.Length = UnicodeString.Length / sizeof(WCHAR); - } return AnsiString.Length; } @@ -184,6 +197,7 @@ { UNICODE_STRING UnicodeString; ANSI_STRING AnsiString; + USHORT Length; AnsiString.Length = 0; AnsiString.MaximumLength = nBufferLength; @@ -201,13 +215,33 @@ /* convert unicode string to ansi (or oem) */ if (bIsFileApiAnsi) + { + if ((Length = RtlUnicodeStringToAnsiSize(&UnicodeString)) > + AnsiString.MaximumLength) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + UnicodeString.Buffer); + return Length; + } + RtlUnicodeStringToAnsiString (&AnsiString, &UnicodeString, FALSE); - else + } else { + if ((Length = RtlUnicodeStringToOemSize(&UnicodeString)) > + AnsiString.MaximumLength) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + UnicodeString.Buffer); + return Length; + } + RtlUnicodeStringToOemString (&AnsiString, &UnicodeString, FALSE); + } /* free unicode string buffer */ RtlFreeHeap (RtlGetProcessHeap (),