[OLE #94] Correctly marshal NULL ppUnk refptrs in NdrPointerMarshall

Robert Shearman rob at codeweavers.com
Mon Jun 6 11:11:36 CDT 2005


Mike Hearn wrote:

>On Mon, 2005-06-06 at 10:26 -0500, Robert Shearman wrote:
>  
>
>>>  switch (type) {
>>>-  case RPC_FC_RP: /* ref pointer (always non-null) */
>>>-#if 0 /* this causes problems for InstallShield so is disabled - we
>>>      
>>>
>>need more tests */
>>    
>>
>>>-    if (!Pointer)
>>>-      RpcRaiseException(RPC_X_NULL_REF_POINTER);
>>>-#endif
>>>+  case RPC_FC_RP: /* ref pointer (always non-null but may point to
>>>      
>>>
>>null) */
>>    
>>
>>>    break;
>>>  case RPC_FC_UP: /* unique pointer */
>>>  case RPC_FC_OP: /* object pointer - same as unique here */
>>>
>>> 
>>>
>>>      
>>>
>>This looks wrong. A ref pointer shouldn't be treated as a unique
>>pointer in any circumstances AFAIK. I'll add this case to my mini test
>>suite to confirm or deny this hypothesis.
>>    
>>
>
>This is wire-sizing, the full code is:
>
>  switch (type) {
>  case RPC_FC_RP:
>  case RPC_FC_OP:
>  case RPC_FC_UP:
>    pStubMsg->BufferLength += 4;
>    /* NULL pointer has no further representation */
>    if (!Pointer)
>        return;
>    break;
>  case RPC_FC_FP:
>  default:
>    FIXME("unhandled ptr type=%02x\n", type);
>    RpcRaiseException(RPC_X_BAD_STUB_DATA);
>  }
>
>  m = NdrBufferSizer[*desc & NDR_TABLE_MASK];
>  if (m) m(pStubMsg, Pointer, desc);
>  else FIXME("no buffersizer for data type=%02x\n", *desc);
>
>In this case, we need to reserve space for a refptr on the wire to be
>able to tell the difference between NULL and non-NULL. So it reserves 4
>bytes in the buffer. 
>  
>

Exactly. A refptr shouldn't have those extra 4 bytes because it should 
never be NULL. I would be very surprised if Microsoft have chosen to be 
inconsistent here.


-- 
Rob Shearman




More information about the wine-devel mailing list