s4:librpc: avoid talloc_reference() in dcerpc_epm_map_binding_send()
authorStefan Metzmacher <metze@samba.org>
Thu, 8 Aug 2013 11:56:51 +0000 (13:56 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 12 Aug 2013 04:48:46 +0000 (16:48 +1200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/librpc/rpc/dcerpc_connect.c
source4/librpc/rpc/dcerpc_sock.c
source4/librpc/rpc/dcerpc_util.c

index 280b7aeb0e5ba10af15958e5042a4dd5caebf9eb..eb53a115e3c104d267d0206202863e791a7bd036 100644 (file)
@@ -323,9 +323,18 @@ static struct composite_context* dcerpc_pipe_connect_ncacn_ip_tcp_send(TALLOC_CT
 
        /* store input parameters in state structure */
        s->io               = *io;
-       s->localaddr        = talloc_reference(c, io->binding->localaddress);
-       s->host             = talloc_reference(c, io->binding->host);
-       s->target_hostname  = talloc_reference(c, io->binding->target_hostname);
+       if (io->binding->localaddress != NULL) {
+               s->localaddr = talloc_strdup(s, io->binding->localaddress);
+               if (composite_nomem(s->localaddr, c)) return c;
+       }
+       if (io->binding->host != NULL) {
+               s->host = talloc_strdup(s, io->binding->host);
+               if (composite_nomem(s->host, c)) return c;
+       }
+       if (io->binding->target_hostname != NULL) {
+               s->target_hostname = talloc_strdup(s, io->binding->target_hostname);
+               if (composite_nomem(s->target_hostname, c)) return c;
+       }
                              /* port number is a binding endpoint here */
        s->port             = atoi(io->binding->endpoint);   
 
index 58fca4ce37236669b5fdc131ac46c0cf7fe5c010..a911dba825e1b6f0416f4c89b1e741c23efcae83 100644 (file)
@@ -327,12 +327,15 @@ static struct composite_context *dcerpc_pipe_open_socket_send(TALLOC_CTX *mem_ct
        s->conn      = cn;
        s->transport = transport;
        if (localaddr) {
-               s->localaddr = talloc_reference(c, localaddr);
+               s->localaddr = socket_address_copy(s, localaddr);
                if (composite_nomem(s->localaddr, c)) return c;
        }
-       s->server    = talloc_reference(c, server);
+       s->server = socket_address_copy(s, server);
        if (composite_nomem(s->server, c)) return c;
-       s->target_hostname = talloc_reference(s, target_hostname);
+       if (target_hostname) {
+               s->target_hostname = talloc_strdup(s, target_hostname);
+               if (composite_nomem(s->target_hostname, c)) return c;
+       }
 
        s->sock = talloc(cn, struct sock_private);
        if (composite_nomem(s->sock, c)) return c;
@@ -342,7 +345,10 @@ static struct composite_context *dcerpc_pipe_open_socket_send(TALLOC_CTX *mem_ct
 
        talloc_steal(s->sock, s->socket_ctx);
 
-       s->sock->path = talloc_reference(s->sock, full_path);
+       if (full_path != NULL) {
+               s->sock->path = talloc_strdup(s->sock, full_path);
+               if (composite_nomem(s->sock->path, c)) return c;
+       }
 
        conn_req = socket_connect_send(s->socket_ctx, s->localaddr, s->server, 0,
                                       c->event_ctx);
index 2a0c40566d7cdd5f80b9acca6f7092e0aec0ecf4..1364fdce35324f673cbd4852948eebd1721a0190 100644 (file)
@@ -203,8 +203,8 @@ static void continue_epm_map(struct tevent_req *subreq)
        }
 
        /* get received endpoint */
-       s->binding->endpoint = talloc_reference(s->binding,
-                                               dcerpc_floor_get_rhs_data(c, &s->twr_r->tower.floors[3]));
+       s->binding->endpoint = dcerpc_floor_get_rhs_data(s->binding,
+                                                        &s->twr_r->tower.floors[3]);
        if (composite_nomem(s->binding->endpoint, c)) return;
 
        composite_done(c);
@@ -249,6 +249,7 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
 
        /* anonymous credentials for rpc connection used to get endpoint mapping */
        anon_creds = cli_credentials_init(mem_ctx);
+       if (composite_nomem(anon_creds, c)) return c;
        cli_credentials_set_anonymous(anon_creds);
 
        /*
@@ -266,7 +267,8 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
                                        binding->transport = default_binding->transport;
                                if (default_binding->transport == binding->transport && 
                                        default_binding->endpoint) {
-                                       binding->endpoint = talloc_reference(binding, default_binding->endpoint);
+                                       binding->endpoint = talloc_strdup(binding, default_binding->endpoint);
+                                       if (composite_nomem(binding->endpoint, c)) return c;
                                        talloc_free(default_binding);
 
                                        composite_done(c);
@@ -284,10 +286,16 @@ struct composite_context *dcerpc_epm_map_binding_send(TALLOC_CTX *mem_ctx,
 
        /* basic endpoint mapping data */
        epmapper_binding->transport             = binding->transport;
-       epmapper_binding->host                  = talloc_reference(epmapper_binding, binding->host);
+       if (binding->host != NULL) {
+               epmapper_binding->host = talloc_strdup(epmapper_binding, binding->host);
+               if (composite_nomem(epmapper_binding->host, c)) return c;
+       }
        epmapper_binding->target_hostname       = epmapper_binding->host;
        epmapper_binding->options               = NULL;
-       epmapper_binding->localaddress          = talloc_reference(epmapper_binding, binding->localaddress);
+       if (binding->localaddress != NULL) {
+               epmapper_binding->localaddress = talloc_strdup(epmapper_binding, binding->localaddress);
+               if (composite_nomem(epmapper_binding->localaddress, c)) return c;
+       }
        epmapper_binding->flags                 = 0;
        epmapper_binding->assoc_group_id        = 0;
        epmapper_binding->endpoint              = NULL;