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