Module: wine Branch: master Commit: 1a3d7c77a51f3d9d144d33bcee19bb81634364c6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1a3d7c77a51f3d9d144d33bcee...
Author: Rob Shearman rob@codeweavers.com Date: Tue Jan 15 12:09:52 2008 +0000
rpcrt4: Allow NULL networkaddr and endpoint in rpcrt4_np_get_top_of_tower.
Add tests for this.
---
dlls/rpcrt4/rpc_transport.c | 14 ++++++++++---- dlls/rpcrt4/tests/rpc.c | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c index 4fda513..eb6bd8d 100644 --- a/dlls/rpcrt4/rpc_transport.c +++ b/dlls/rpcrt4/rpc_transport.c @@ -422,8 +422,8 @@ static size_t rpcrt4_ncacn_np_get_top_of_tower(unsigned char *tower_data,
TRACE("(%p, %s, %s)\n", tower_data, networkaddr, endpoint);
- networkaddr_size = strlen(networkaddr) + 1; - endpoint_size = strlen(endpoint) + 1; + networkaddr_size = networkaddr ? strlen(networkaddr) + 1 : 1; + endpoint_size = endpoint ? strlen(endpoint) + 1 : 1; size = sizeof(*smb_floor) + endpoint_size + sizeof(*nb_floor) + networkaddr_size;
if (!tower_data) @@ -437,7 +437,10 @@ static size_t rpcrt4_ncacn_np_get_top_of_tower(unsigned char *tower_data, smb_floor->protid = EPM_PROTOCOL_SMB; smb_floor->count_rhs = endpoint_size;
- memcpy(tower_data, endpoint, endpoint_size); + if (endpoint) + memcpy(tower_data, endpoint, endpoint_size); + else + tower_data[0] = 0; tower_data += endpoint_size;
nb_floor = (twr_empty_floor_t *)tower_data; @@ -448,7 +451,10 @@ static size_t rpcrt4_ncacn_np_get_top_of_tower(unsigned char *tower_data, nb_floor->protid = EPM_PROTOCOL_NETBIOS; nb_floor->count_rhs = networkaddr_size;
- memcpy(tower_data, networkaddr, networkaddr_size); + if (networkaddr) + memcpy(tower_data, networkaddr, networkaddr_size); + else + tower_data[0] = 0; tower_data += networkaddr_size;
return size; diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c index 17721d8..e92b057 100644 --- a/dlls/rpcrt4/tests/rpc.c +++ b/dlls/rpcrt4/tests/rpc.c @@ -374,6 +374,16 @@ static void test_towers(void)
I_RpcFree(address); I_RpcFree(tower); + + /* test the behaviour for np with no address */ + ret = TowerConstruct(&mapi_if_id, &ndr_syntax, "ncacn_np", "\pipe\test", NULL, &tower); + ok(ret == RPC_S_OK, "TowerConstruct failed with error %ld\n", ret); + ret = TowerExplode(tower, NULL, NULL, NULL, NULL, &address); + ok(ret == RPC_S_OK, "TowerExplode failed with error %ld\n", ret); + ok(!strcmp(address, ""), "address was "%s" instead of ""\n", address); + + I_RpcFree(address); + I_RpcFree(tower); }
static void test_I_RpcMapWin32Status(void)