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