From: Maxim Karasev mxkrsv@etersoft.ru
--- dlls/secur32/secur32.c | 60 +++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 21 deletions(-)
diff --git a/dlls/secur32/secur32.c b/dlls/secur32/secur32.c index d703757bae7..beb52d7d6da 100644 --- a/dlls/secur32/secur32.c +++ b/dlls/secur32/secur32.c @@ -1108,31 +1108,49 @@ BOOLEAN WINAPI GetUserNameExW( { case NameSamCompatible: { - WCHAR samname[UNLEN + 1 + MAX_COMPUTERNAME_LENGTH + 1]; - LPWSTR out; - DWORD len; + WCHAR *output; + DWORD len = 0; + BOOL status;
- /* This assumes the current user is always a local account */ - len = MAX_COMPUTERNAME_LENGTH + 1; - if (GetComputerNameW(samname, &len)) + status = GetComputerNameExW(ComputerNameDnsHostname, NULL, &len); + if (status || GetLastError() != ERROR_MORE_DATA) { - out = samname + lstrlenW(samname); - *out++ = '\'; - len = UNLEN + 1; - if (GetUserNameW(out, &len)) - { - if (lstrlenW(samname) < *nSize) - { - lstrcpyW(lpNameBuffer, samname); - *nSize = lstrlenW(samname); - return TRUE; - } + ERR("GetComputerNameExW expected ERROR_MORE_DATA, error %lu\n", GetLastError()); + return FALSE; + }
- SetLastError(ERROR_MORE_DATA); - *nSize = lstrlenW(samname) + 1; - } + output = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (len + 1 + UNLEN + 1)); + + status = GetComputerNameExW(ComputerNameDnsHostname, output, &len); + if (!status) + { + ERR("GetComputerNameExW failed, error %lu\n", GetLastError()); + return FALSE; } - return FALSE; + + wcscat(output, L"\"); + + len = UNLEN + 1; + + status = GetUserNameW(&output[wcslen(output)], &len); + if (!status) + { + ERR("GetUserNameW failed, error %lu\n", GetLastError()); + return FALSE; + } + + if (lstrlenW(output) >= *nSize) + { + TRACE("Output buffer too small\n"); + SetLastError(ERROR_MORE_DATA); + *nSize = lstrlenW(output) + 1; + return FALSE; + } + + lstrcpyW(lpNameBuffer, output); + *nSize = lstrlenW(output); + + return TRUE; }
case NameUnknown: