2009/2/6 Nikolay Sivov <bungleh...@gmail.com>:
> Rob Shearman wrote:
>> 2009/2/5 Nikolay Sivov <bungleh...@gmail.com>:
>>
>>> Changelog:
>>>    - Check for null endpoint in RpcServerUseProtseqEpExW.
>>>      Installed IE8 RC1 crashes on this call, parameter set is specified in
>>>      test case.
>>>
>>> >From 89f889b2c7a754302b599884577b4eba22b3d235 Mon Sep 17 00:00:00 2001
>>> From: Nikolay Sivov <bungleh...@gmail.com>
>>> Date: Thu, 5 Feb 2009 22:03:48 +0300
>>> Subject: Check for null endpoint in RpcServerUseProtseqEpExW
>>>
>>> ---
>>>  dlls/rpcrt4/rpc_server.c |    6 ++++--
>>>  dlls/rpcrt4/tests/rpc.c  |   15 +++++++++++++++
>>>  2 files changed, 19 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c
>>> index b6e058a..e9bed42 100644
>>> --- a/dlls/rpcrt4/rpc_server.c
>>> +++ b/dlls/rpcrt4/rpc_server.c
>>> @@ -775,8 +775,10 @@ RPC_STATUS WINAPI RpcServerUseProtseqEpExW( RPC_WSTR 
>>> Protseq, UINT MaxCalls, RPC
>>>     return status;
>>>
>>>   EndpointA = RPCRT4_strdupWtoA(Endpoint);
>>> -  status = RPCRT4_use_protseq(ps, EndpointA);
>>> -  RPCRT4_strfree(EndpointA);
>>> +  if (EndpointA) {
>>> +      status = RPCRT4_use_protseq(ps, EndpointA);
>>> +      RPCRT4_strfree(EndpointA);
>>> +  }
>>>
>>
>> This isn't correct, I'm afraid. The protseq open function should
>> generate an endpoint name to use. For example, the ncacn_ip_tcp code
>> should select a random available TCP port.
>>
>>
>>>   return status;
>>>  }
>>>
>>> diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c
>>> index bf538e4..b815acc 100644
>>> --- a/dlls/rpcrt4/tests/rpc.c
>>> +++ b/dlls/rpcrt4/tests/rpc.c
>>> @@ -830,6 +830,20 @@ static void test_UuidCreate(void)
>>>     }
>>>  }
>>>
>>> +static void test_RpcServerUseProtseqEpEx(void)
>>> +{
>>> +    RPC_STATUS status;
>>> +    RPC_POLICY policy;
>>> +    static WCHAR protW[] = {'n','c','a','l','r','p','c',0};
>>> +
>>> +    policy.Length        = sizeof( policy );
>>> +    policy.EndpointFlags = 0;
>>> +    policy.NICFlags      = 0;
>>> +
>>> +    status = RpcServerUseProtseqEpExW(protW, 10, NULL, NULL, &policy);
>>> +    ok(status == RPC_S_OK, "Expected RPC_S_OK, got %d\n", status);
>>> +}
>>>
>>
>> This is a good start, but you should also test the bindings created as
>> a result of doing this and then you will probably discover that the
>> fix to RpcServerUseProtseqEpExW isn't quite correct.
>>
>>
>>
>>>  START_TEST( rpc )
>>>  {
>>>     static unsigned char ncacn_np[] = "ncacn_np";
>>> @@ -849,4 +863,5 @@ START_TEST( rpc )
>>>     test_endpoint_mapper(ncalrpc, NULL, lrpc_endpoint);
>>>     test_RpcStringBindingFromBinding();
>>>     test_UuidCreate();
>>> +    test_RpcServerUseProtseqEpEx();
>>>  }
>>>
>>
>>
> Ok, I'll try to find out.
> Rob, could you suggest a good documentation source on RPC? I'm not
> experienced in it.

Sure, although this particular aspect isn't well documented. I did
find a couple of references, but you have to fill in the blanks to get
to the conclusion that RpcServerUseProtseqEpEx with a NULL endpoint
should generate an otherwise unused endpoint string:
http://www.opengroup.org/onlinepubs/9629399/chap2.htm#tagcjh_05_02_03
http://msdn.microsoft.com/en-us/library/aa378452(VS.85).aspx - "The
endpoint name is generated by the RPC run time or the operating
system."

The following may also be useful in future RPC issues, but not in this case:
http://msdn.microsoft.com/en-us/library/cc243560(PROT.10).aspx

-- 
Rob Shearman


Reply via email to