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


Reply via email to