Remove trailing spaces from the filename in RtlGetFullPathName_U.
diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c
index a2c8b08..3edeba4 100644
--- a/dlls/ntdll/path.c
+++ b/dlls/ntdll/path.c
@@ -533,13 +533,18 @@
*/
static ULONG get_full_path_helper(LPCWSTR name, LPWSTR buffer, ULONG size)
{
- ULONG reqsize = 0, mark = 0, dep = 0, deplen;
+ ULONG reqsize = 0, mark = 0, dep = 0, deplen, name_len;
DOS_PATHNAME_TYPE type;
LPWSTR ins_str = NULL;
LPCWSTR ptr;
const UNICODE_STRING* cd;
WCHAR tmp[4];
+ /* remove trailing spaces (yes, Windows really does that, don't ask) */
+ name_len = strlenW( name );
+ while (name_len && name[name_len-1] == ' ') name_len--;
+ if (!name_len) return 0;
+
RtlAcquirePebLock();
if (NtCurrentTeb()->Tib.SubSystemTib) /* FIXME: hack */
@@ -674,7 +679,7 @@
}
/* enough space ? */
- deplen = strlenW(name + dep) * sizeof(WCHAR);
+ deplen = (name_len - dep) * sizeof(WCHAR);
if (reqsize + deplen + sizeof(WCHAR) > size)
{
/* not enough space, return need size (including terminating '\0') */
@@ -682,7 +687,8 @@
goto done;
}
- memmove(buffer + reqsize / sizeof(WCHAR), name + dep, deplen + sizeof(WCHAR));
+ memmove(buffer + reqsize / sizeof(WCHAR), name + dep, deplen);
+ buffer[(reqsize + deplen) / sizeof(WCHAR)] = 0;
if (reqsize) memcpy(buffer, ins_str, reqsize);
reqsize += deplen;
@@ -737,6 +743,7 @@
}
reqsize = get_full_path_helper(name, buffer, size);
+ if (!reqsize) return 0;
if (reqsize > size)
{
LPWSTR tmp = RtlAllocateHeap(GetProcessHeap(), 0, reqsize);
diff --git a/dlls/ntdll/tests/path.c b/dlls/ntdll/tests/path.c
index 702762e..4c6a963 100644
--- a/dlls/ntdll/tests/path.c
+++ b/dlls/ntdll/tests/path.c
@@ -239,6 +239,7 @@
static const struct test tests[] =
{
{ "c:/test", "c:\\test", "test"},
+ { "c:/test ", "c:\\test", "test"},
{ "c:/TEST", "c:\\test", "test"},
{ "c:/test/file", "c:\\test\\file", "file"},
{ "c:/test/././file", "c:\\test\\file", "file"},