From 1a3d7c77a51f3d9d144d33bcee19bb81634364c6 Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Tue, 15 Jan 2008 12:09:52 +0000 Subject: [PATCH] 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 4fda5131175..eb6bd8d5ace 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 17721d8d53d..e92b05778c3 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) -- 2.11.4.GIT