From dccd41a88aa2984a231f8195f023faff37ab5f8e Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 6 Feb 2006 11:26:57 +0100 Subject: [PATCH] kernel: Fixed regression in atom handling. Added proper tests (local & global functions). --- dlls/kernel/atom.c | 5 ++++- dlls/kernel/tests/atom.c | 33 +++++++++++++++++++++++++++++++++ dlls/ntdll/tests/atom.c | 9 +++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/dlls/kernel/atom.c b/dlls/kernel/atom.c index 510eb61d691..7eb59f58d6a 100644 --- a/dlls/kernel/atom.c +++ b/dlls/kernel/atom.c @@ -485,12 +485,15 @@ UINT WINAPI GlobalGetAtomNameW( ATOM atom, LPWSTR buffer, INT count ) { length = min( abi->NameLength / sizeof(WCHAR), count); memcpy( buffer, abi->Name, length * sizeof(WCHAR) ); + /* yes, the string will not be null terminated if the passed buffer + * is one WCHAR too small (and it's not an error) + */ if (length < abi->NameLength / sizeof(WCHAR)) { SetLastError( ERROR_MORE_DATA ); length = count; } - else buffer[length] = '\0'; + else if (length < count) buffer[length] = '\0'; } return length; } diff --git a/dlls/kernel/tests/atom.c b/dlls/kernel/tests/atom.c index 45288acddf9..416a29e7028 100644 --- a/dlls/kernel/tests/atom.c +++ b/dlls/kernel/tests/atom.c @@ -220,6 +220,21 @@ static void test_get_atom_name(void) } } + memset( buf, '.', sizeof(buf) ); + len = GlobalGetAtomNameA( atom, buf, 6 ); + ok( len == 0, "bad length %d\n", len ); + ok( !memcmp( buf, "fooba\0....", 10 ), "bad buffer contents\n"); + if (unicode_OS) + { + static const WCHAR resW[] = {'f','o','o','b','a','r','.','.','.','.'}; + for (len = 0; len < 10; len++) bufW[len] = '.'; + SetLastError(0xdeadbeef); + len = GlobalGetAtomNameW( atom, bufW, 6 ); + ok( len && GetLastError() == 0xdeadbeef, "GlobalGetAtomNameW failed\n" ); + ok( len == lstrlenW(foobarW), "bad length %d\n", len ); + ok( !memcmp( bufW, resW, 10*sizeof(WCHAR) ), "bad buffer contents\n" ); + } + /* test string limits & overflow */ do_initA(in, "abcdefghij", 255); atom = GlobalAddAtomA(in); @@ -428,6 +443,24 @@ static void test_local_get_atom_name(void) ok( !memcmp( bufW, resultW, 10*sizeof(WCHAR) ), "bad buffer contents\n" ); } + /* Get the name of the atom we added above */ + memset( buf, '.', sizeof(buf) ); + len = GetAtomNameA( atom, buf, 6 ); + ok( len == 5, "bad length %d\n", len ); + ok( !memcmp( buf, "fooba\0....", 10 ), "bad buffer contents\n" ); + + /* Repeat, unicode-style */ + if (unicode_OS) + { + WCHAR resW[] = {'f','o','o','b','a','\0','.','.','.','.'}; + for (i = 0; i < 10; i++) bufW[i] = '.'; + SetLastError( 0xdeadbeef ); + len = GetAtomNameW( atom, bufW, 6 ); + ok( len && GetLastError() == 0xdeadbeef, "GlobalGetAtomNameW failed\n" ); + ok( len == 5, "bad length %d\n", len ); + ok( !memcmp( bufW, resW, 10*sizeof(WCHAR) ), "bad buffer contents\n" ); + } + /* Check error code returns */ memset(buf, '.', 10); ok( !GetAtomNameA( atom, buf, 0 ), "succeeded\n" ); diff --git a/dlls/ntdll/tests/atom.c b/dlls/ntdll/tests/atom.c index a48e2cf473f..c0a8e2d4d0d 100644 --- a/dlls/ntdll/tests/atom.c +++ b/dlls/ntdll/tests/atom.c @@ -207,6 +207,15 @@ static void test_NtAtom(void) ok(!Name[3], "wrong string termination\n"); ok(Name[4] == 0x55AA, "buffer overwrite\n"); + Len = lstrlenW(testAtom2) * sizeof(WCHAR); + memset(Name, '.', sizeof(Name)); + res = pRtlQueryAtomInAtomTable( AtomTable, Atom2, NULL, NULL, Name, &Len ); + ok(!res, "query atom %lx\n", res); + ok(Len == (lstrlenW(testAtom2) - 1) * sizeof(WCHAR), "wrong length %lu\n", Len); + ok(!memcmp(testAtom2, Name, (lstrlenW(testAtom2) - 1) * sizeof(WCHAR)), "wrong atom name\n"); + ok(Name[lstrlenW(testAtom2) - 1] == '\0', "wrong char\n"); + ok(Name[lstrlenW(testAtom2)] == ('.' << 8) + '.', "wrong char\n"); + res = pRtlLookupAtomInAtomTable(AtomTable, testAtom2, &testAtom); ok(!res, "We can't find our pinned atom!! retval: %lx\n", res); ok(testAtom == Atom2, "We found wrong atom!!!\n");