Eric Pouech : kernel: Fixed regression in atom handling.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 6 05:10:16 CST 2006
Module: wine
Branch: refs/heads/master
Commit: dccd41a88aa2984a231f8195f023faff37ab5f8e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=dccd41a88aa2984a231f8195f023faff37ab5f8e
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Mon Feb 6 11:26:57 2006 +0100
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 deletions(-)
diff --git a/dlls/kernel/atom.c b/dlls/kernel/atom.c
index 510eb61..7eb59f5 100644
--- a/dlls/kernel/atom.c
+++ b/dlls/kernel/atom.c
@@ -485,12 +485,15 @@ UINT WINAPI GlobalGetAtomNameW( ATOM ato
{
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 45288ac..416a29e 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(voi
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 a48e2cf..c0a8e2d 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");
More information about the wine-cvs
mailing list