Module: wine Branch: master Commit: 81c922398e4c820900d48aede254818ecc5c4fe4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=81c922398e4c820900d48aede2...
Author: Alasdair Sinclair alasdairs@dsl.pipex.com Date: Sat Mar 3 03:03:53 2007 +0000
kernel32: Fix GetComputerNameA to not count trailing NULL, with test.
---
dlls/kernel32/computername.c | 11 +++++------ dlls/kernel32/tests/environ.c | 11 +++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/computername.c b/dlls/kernel32/computername.c index db9799a..754f86c 100644 --- a/dlls/kernel32/computername.c +++ b/dlls/kernel32/computername.c @@ -371,7 +371,7 @@ out: BOOL WINAPI GetComputerNameA(LPSTR name, LPDWORD size) { WCHAR nameW[ MAX_COMPUTERNAME_LENGTH + 1 ]; - DWORD sizeW = MAX_COMPUTERNAME_LENGTH; + DWORD sizeW = MAX_COMPUTERNAME_LENGTH + 1; unsigned int len; BOOL ret;
@@ -381,17 +381,16 @@ BOOL WINAPI GetComputerNameA(LPSTR name, LPDWORD size) /* for compatibility with Win9x */ __TRY { - if ( *size < len + 1 ) + if ( *size < len ) { - *size = len + 1; + *size = len; SetLastError( ERROR_MORE_DATA ); ret = FALSE; } - else + else { WideCharToMultiByte ( CP_ACP, 0, nameW, -1, name, len, NULL, 0 ); - name[len] = 0; - *size = len; + *size = len - 1; ret = TRUE; } } diff --git a/dlls/kernel32/tests/environ.c b/dlls/kernel32/tests/environ.c index 43a8566..aa61b8e 100644 --- a/dlls/kernel32/tests/environ.c +++ b/dlls/kernel32/tests/environ.c @@ -239,6 +239,7 @@ static void test_GetComputerName(void) LPSTR name; LPWSTR nameW; DWORD error; + int name_len;
size = 0; ret = GetComputerNameA((LPSTR)0xdeadbeef, &size); @@ -250,6 +251,16 @@ static void test_GetComputerName(void) ok(ret, "GetComputerNameA failed with error %d\n", GetLastError()); HeapFree(GetProcessHeap(), 0, name);
+ size = MAX_COMPUTERNAME_LENGTH + 1; + name = HeapAlloc(GetProcessHeap(), 0, size * sizeof(name[0])); + ok(name != NULL, "HeapAlloc failed with error %d\n", GetLastError()); + ret = GetComputerNameA(name, &size); + ok(ret, "GetComputerNameA failed with error %d\n", GetLastError()); + trace("computer name is "%s"\n", name); + name_len = strlen(name); + ok(size == name_len, "size should be same as length, name_len=%d, size=%d\n", name_len, size); + HeapFree(GetProcessHeap(), 0, name); + size = 0; ret = GetComputerNameW((LPWSTR)0xdeadbeef, &size); error = GetLastError();