Alexandre Julliard : rpcrt4: Add a phase in proxies for zeroing output parameters on startup.

Alexandre Julliard julliard at winehq.org
Fri Jul 29 12:37:00 CDT 2011


Module: wine
Branch: master
Commit: 2bdff697338cc559580a863e3c2e85d5a292f761
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2bdff697338cc559580a863e3c2e85d5a292f761

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul 28 22:43:12 2011 +0200

rpcrt4: Add a phase in proxies for zeroing output parameters on startup.

---

 dlls/rpcrt4/ndr_stubless.c |  162 ++++++++++++++++++++++++--------------------
 1 files changed, 89 insertions(+), 73 deletions(-)

diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index 017be5d..243a0af 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -144,6 +144,62 @@ static inline void call_freer(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemor
     if (m) m(pStubMsg, pMemory, pFormat);
 }
 
+static DWORD calc_arg_size(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
+{
+    DWORD size;
+    switch(*pFormat)
+    {
+    case RPC_FC_STRUCT:
+        size = *(const WORD*)(pFormat + 2);
+        break;
+    case RPC_FC_BOGUS_STRUCT:
+        size = *(const WORD*)(pFormat + 2);
+        if(*(const WORD*)(pFormat + 4))
+            FIXME("Unhandled conformant description\n");
+        break;
+    case RPC_FC_CARRAY:
+    case RPC_FC_CVARRAY:
+        size = *(const WORD*)(pFormat + 2);
+        ComputeConformance(pStubMsg, NULL, pFormat + 4, 0);
+        size *= pStubMsg->MaxCount;
+        break;
+    case RPC_FC_SMFARRAY:
+    case RPC_FC_SMVARRAY:
+        size = *(const WORD*)(pFormat + 2);
+        break;
+    case RPC_FC_LGFARRAY:
+    case RPC_FC_LGVARRAY:
+        size = *(const DWORD*)(pFormat + 2);
+        break;
+    case RPC_FC_BOGUS_ARRAY:
+        pFormat = ComputeConformance(pStubMsg, NULL, pFormat + 4, *(const WORD*)&pFormat[2]);
+        TRACE("conformance = %ld\n", pStubMsg->MaxCount);
+        pFormat = ComputeVariance(pStubMsg, NULL, pFormat, pStubMsg->MaxCount);
+        size = ComplexStructSize(pStubMsg, pFormat);
+        size *= pStubMsg->MaxCount;
+        break;
+    case RPC_FC_C_CSTRING:
+    case RPC_FC_C_WSTRING:
+        if (*pFormat == RPC_FC_C_CSTRING)
+            size = sizeof(CHAR);
+        else
+            size = sizeof(WCHAR);
+        if (pFormat[1] == RPC_FC_STRING_SIZED)
+            ComputeConformance(pStubMsg, NULL, pFormat + 2, 0);
+        else
+            pStubMsg->MaxCount = 0;
+        size *= pStubMsg->MaxCount;
+        break;
+    default:
+        FIXME("Unhandled type %02x\n", *pFormat);
+        /* fallthrough */
+    case RPC_FC_RP:
+        size = sizeof(void *);
+        break;
+    }
+    return size;
+}
+
 void WINAPI NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE pMessage)
 {
 #if 0 /* these functions are not defined yet */
@@ -367,6 +423,13 @@ void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum s
 
         switch (phase)
         {
+        case STUBLESS_INITOUT:
+            if (!params[i].attr.IsBasetype && params[i].attr.IsOut &&
+                !params[i].attr.IsIn && !params[i].attr.IsByValue)
+            {
+                memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
+            }
+            break;
         case STUBLESS_CALCSIZE:
             if (params[i].attr.IsSimpleRef && !*(unsigned char **)pArg)
                 RpcRaiseException(RPC_X_NULL_REF_POINTER);
@@ -648,24 +711,33 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
     }
 
     /* order of phases:
-     * 1. CALCSIZE - calculate the buffer size
-     * 2. GETBUFFER - allocate the buffer
-     * 3. MARSHAL - marshal [in] params into the buffer
-     * 4. SENDRECEIVE - send/receive buffer
-     * 5. UNMARSHAL - unmarshal [out] params from buffer
-     * 6. FREE - clear [out] parameters (for proxies, and only on error)
+     * 1. INITOUT - zero [out] parameters (proxies only)
+     * 2. CALCSIZE - calculate the buffer size
+     * 3. GETBUFFER - allocate the buffer
+     * 4. MARSHAL - marshal [in] params into the buffer
+     * 5. SENDRECEIVE - send/receive buffer
+     * 6. UNMARSHAL - unmarshal [out] params from buffer
+     * 7. FREE - clear [out] parameters (for proxies, and only on error)
      */
     if ((pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT) ||
         (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_HAS_COMM_OR_FAULT))
     {
+        /* 1. INITOUT */
+        if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
+        {
+            TRACE( "INITOUT\n" );
+            client_do_args(&stubMsg, pFormat, STUBLESS_INITOUT, fpu_stack,
+                           number_of_params, (unsigned char *)&RetVal);
+        }
+
         __TRY
         {
-            /* 1. CALCSIZE */
+            /* 2. CALCSIZE */
             TRACE( "CALCSIZE\n" );
             client_do_args(&stubMsg, pFormat, STUBLESS_CALCSIZE, fpu_stack,
                            number_of_params, (unsigned char *)&RetVal);
 
-            /* 2. GETBUFFER */
+            /* 3. GETBUFFER */
             TRACE( "GETBUFFER\n" );
             if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
             {
@@ -691,12 +763,12 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
                 }
             }
 
-            /* 3. MARSHAL */
+            /* 4. MARSHAL */
             TRACE( "MARSHAL\n" );
             client_do_args(&stubMsg, pFormat, STUBLESS_MARSHAL, fpu_stack,
                            number_of_params, (unsigned char *)&RetVal);
 
-            /* 4. SENDRECEIVE */
+            /* 5. SENDRECEIVE */
             TRACE( "SENDRECEIVE\n" );
             if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
             {
@@ -729,7 +801,7 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
             if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
                 NdrConvert(&stubMsg, pFormat);
 
-            /* 5. UNMARSHAL */
+            /* 6. UNMARSHAL */
             TRACE( "UNMARSHAL\n" );
             client_do_args(&stubMsg, pFormat, STUBLESS_UNMARSHAL, fpu_stack,
                            number_of_params, (unsigned char *)&RetVal);
@@ -738,7 +810,7 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
         {
             if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
             {
-                /* 6. FREE */
+                /* 7. FREE */
                 TRACE( "FREE\n" );
                 client_do_args(&stubMsg, pFormat, STUBLESS_FREE, fpu_stack,
                                number_of_params, (unsigned char *)&RetVal);
@@ -774,12 +846,12 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
     }
     else
     {
-        /* 1. CALCSIZE */
+        /* 2. CALCSIZE */
         TRACE( "CALCSIZE\n" );
         client_do_args(&stubMsg, pFormat, STUBLESS_CALCSIZE, fpu_stack,
                        number_of_params, (unsigned char *)&RetVal);
 
-        /* 2. GETBUFFER */
+        /* 3. GETBUFFER */
         TRACE( "GETBUFFER\n" );
         if (Oif_flags.HasPipes)
             /* NdrGetPipeBuffer(...) */
@@ -796,12 +868,12 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
                 NdrGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
         }
 
-        /* 3. MARSHAL */
+        /* 4. MARSHAL */
         TRACE( "MARSHAL\n" );
         client_do_args(&stubMsg, pFormat, STUBLESS_MARSHAL, fpu_stack,
                        number_of_params, (unsigned char *)&RetVal);
 
-        /* 4. SENDRECEIVE */
+        /* 5. SENDRECEIVE */
         TRACE( "SENDRECEIVE\n" );
         if (Oif_flags.HasPipes)
             /* NdrPipesSendReceive(...) */
@@ -823,7 +895,7 @@ LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
         if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
             NdrConvert(&stubMsg, pFormat);
 
-        /* 5. UNMARSHAL */
+        /* 6. UNMARSHAL */
         TRACE( "UNMARSHAL\n" );
         client_do_args(&stubMsg, pFormat, STUBLESS_UNMARSHAL, fpu_stack,
                        number_of_params, (unsigned char *)&RetVal);
@@ -1000,62 +1072,6 @@ LONG_PTR __cdecl call_server_func(SERVER_ROUTINE func, unsigned char * args, uns
 }
 #endif
 
-static DWORD calc_arg_size(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
-{
-    DWORD size;
-    switch(*pFormat)
-    {
-    case RPC_FC_STRUCT:
-        size = *(const WORD*)(pFormat + 2);
-        break;
-    case RPC_FC_BOGUS_STRUCT:
-        size = *(const WORD*)(pFormat + 2);
-        if(*(const WORD*)(pFormat + 4))
-            FIXME("Unhandled conformant description\n");
-        break;
-    case RPC_FC_CARRAY:
-    case RPC_FC_CVARRAY:
-        size = *(const WORD*)(pFormat + 2);
-        ComputeConformance(pStubMsg, NULL, pFormat + 4, 0);
-        size *= pStubMsg->MaxCount;
-        break;
-    case RPC_FC_SMFARRAY:
-    case RPC_FC_SMVARRAY:
-        size = *(const WORD*)(pFormat + 2);
-        break;
-    case RPC_FC_LGFARRAY:
-    case RPC_FC_LGVARRAY:
-        size = *(const DWORD*)(pFormat + 2);
-        break;
-    case RPC_FC_BOGUS_ARRAY:
-        pFormat = ComputeConformance(pStubMsg, NULL, pFormat + 4, *(const WORD*)&pFormat[2]);
-        TRACE("conformance = %ld\n", pStubMsg->MaxCount);
-        pFormat = ComputeVariance(pStubMsg, NULL, pFormat, pStubMsg->MaxCount);
-        size = ComplexStructSize(pStubMsg, pFormat);
-        size *= pStubMsg->MaxCount;
-        break;
-    case RPC_FC_C_CSTRING:
-    case RPC_FC_C_WSTRING:
-        if (*pFormat == RPC_FC_C_CSTRING)
-            size = sizeof(CHAR);
-        else
-            size = sizeof(WCHAR);
-        if (pFormat[1] == RPC_FC_STRING_SIZED)
-            ComputeConformance(pStubMsg, NULL, pFormat + 2, 0);
-        else
-            pStubMsg->MaxCount = 0;
-        size *= pStubMsg->MaxCount;
-        break;
-    default:
-        FIXME("Unhandled type %02x\n", *pFormat);
-        /* fallthrough */
-    case RPC_FC_RP:
-        size = sizeof(void *);
-        break;
-    }
-    return size;
-}
-
 static LONG_PTR *stub_do_args(MIDL_STUB_MESSAGE *pStubMsg,
                               PFORMAT_STRING pFormat, enum stubless_phase phase,
                               unsigned short number_of_params)




More information about the wine-cvs mailing list