Module: wine Branch: refs/heads/master Commit: bf985900e2b5b238b05b5697321bc816a5845926 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=bf985900e2b5b238b05b5697...
Author: Robert Shearman rob@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); }