Rob Shearman : rpcrt4: Allow NULL networkaddr and endpoint in rpcrt4_np_get_top_of_tower.

Alexandre Julliard julliard at winehq.org
Tue Jan 15 07:47:14 CST 2008


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

Author: Rob Shearman <rob at 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)




More information about the wine-cvs mailing list