Robert Shearman : rpcrt4: For full pointers the state consists of flags, so or new flags into the field instead of assigning.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 30 05:56:46 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: bf985900e2b5b238b05b5697321bc816a5845926
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=bf985900e2b5b238b05b5697321bc816a5845926

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon May 29 16:27:16 2006 +0100

rpcrt4: For full pointers the state consists of flags, so or new flags into the field instead of assigning.

The return value of all full pointer functions that return an int 
depends on the passed in query type being a flag in the state.

---

 dlls/rpcrt4/ndr_fullpointer.c    |   21 ++++++++++++---------
 dlls/rpcrt4/tests/ndr_marshall.c |   25 +++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/dlls/rpcrt4/ndr_fullpointer.c b/dlls/rpcrt4/ndr_fullpointer.c
index bd2f5a3..f4485b2 100644
--- a/dlls/rpcrt4/ndr_fullpointer.c
+++ b/dlls/rpcrt4/ndr_fullpointer.c
@@ -113,10 +113,10 @@ int WINAPI NdrFullPointerQueryPointer(PF
         if (pPointer == XlatTableEntry->Pointer)
         {
             *pRefId = XlatTableEntry->RefId;
-            if (pXlatTables->XlatSide == XLAT_SERVER)
-                return XlatTableEntry->State;
-            else
-                return 0;
+            if (XlatTableEntry->State & QueryType)
+                return 1;
+            XlatTableEntry->State |= QueryType;
+            return 0;
         }
 
     XlatTableEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(*XlatTableEntry));
@@ -152,9 +152,10 @@ int WINAPI NdrFullPointerQueryRefId(PFUL
         *ppPointer = pXlatTables->RefIdToPointer.XlatTable[RefId];
         if (QueryType)
         {
-            int ret = pXlatTables->RefIdToPointer.StateTable[RefId];
-            pXlatTables->RefIdToPointer.StateTable[RefId] = QueryType;
-            return ret;
+            if (pXlatTables->RefIdToPointer.StateTable[RefId] & QueryType)
+                return 1;
+            pXlatTables->RefIdToPointer.StateTable[RefId] |= QueryType;
+            return 0;
         }
         else
             return 0;
@@ -209,7 +210,9 @@ int WINAPI NdrFullPointerFree(PFULL_PTR_
     for (; XlatTableEntry; XlatTableEntry = XlatTableEntry->Next)
         if (Pointer == XlatTableEntry->Pointer)
         {
-            XlatTableEntry->State = 0x20;
+            if (XlatTableEntry->State & 0x20)
+                return 0;
+            XlatTableEntry->State |= 0x20;
             RefId = XlatTableEntry->RefId;
             break;
         }
@@ -219,7 +222,7 @@ int WINAPI NdrFullPointerFree(PFULL_PTR_
 
     if (pXlatTables->RefIdToPointer.NumberOfEntries > RefId)
     {
-        pXlatTables->RefIdToPointer.StateTable[RefId] = 0x20;
+        pXlatTables->RefIdToPointer.StateTable[RefId] |= 0x20;
         return 1;
     }
 
diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c
index 22dee82..0a70b9a 100644
--- a/dlls/rpcrt4/tests/ndr_marshall.c
+++ b/dlls/rpcrt4/tests/ndr_marshall.c
@@ -767,9 +767,7 @@ static void test_fullpointer_xlat(void)
     ok(RefId == 0x3, "RefId should be 0x3 instead of 0x%lx\n", RefId);
 
     ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xcafebeef, 0, &RefId);
-    todo_wine {
     ok(ret == 0, "ret should be 0 instead of 0x%x\n", ret);
-    }
     ok(RefId == 0x3, "RefId should be 0x3 instead of 0x%lx\n", RefId);
 
     ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xcafebabe, 0, &RefId);
@@ -785,12 +783,35 @@ static void test_fullpointer_xlat(void)
     ret = NdrFullPointerFree(pXlatTables, (void *)0xcafebeef);
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
 
+    ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xcafebeef, 0x20, &RefId);
+    ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
+    ok(RefId == 0x3, "RefId should be 0x3 instead of 0x%lx\n", RefId);
+
+    ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xcafebeef, 1, &RefId);
+    ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
+    ok(RefId == 0x3, "RefId should be 0x3 instead of 0x%lx\n", RefId);
+
     ret = NdrFullPointerFree(pXlatTables, (void *)0xcafebabe);
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
 
     ret = NdrFullPointerFree(pXlatTables, (void *)0xdeadbeef);
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
 
+    ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xdeadbeef, 0x20, &RefId);
+    ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
+    ok(RefId == 0x4, "RefId should be 0x4 instead of 0x%lx\n", RefId);
+
+    ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xdeadbeef, 1, &RefId);
+    ok(ret == 0, "ret should be 0 instead of 0x%x\n", ret);
+    ok(RefId == 0x4, "RefId should be 0x4 instead of 0x%lx\n", RefId);
+
+    ret = NdrFullPointerQueryPointer(pXlatTables, (void *)0xdeadbeef, 1, &RefId);
+    ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
+    ok(RefId == 0x4, "RefId should be 0x4 instead of 0x%lx\n", RefId);
+
+    ret = NdrFullPointerFree(pXlatTables, (void *)0xdeadbeef);
+    ok(ret == 0, "ret should be 0 instead of 0x%x\n", ret);
+
     NdrFullPointerXlatFree(pXlatTables);
 }
 




More information about the wine-cvs mailing list