Allocate rpc_cli->dc in rpccli_netlogon_setup_creds()
authorVolker Lendecke <vl@samba.org>
Sun, 20 Jul 2008 08:40:43 +0000 (10:40 +0200)
committerVolker Lendecke <vl@samba.org>
Sun, 20 Jul 2008 15:06:21 +0000 (17:06 +0200)
The general cli_pipe routines should not have to know about this NETLOGON
speciality.

source/rpc_client/cli_netlogon.c
source/rpc_client/cli_pipe.c

index cb1d93e9c117ee39fbec4cf8a4c18b14a6114e6b..7beaae2e22415ab7e192a4a3bdfe990b233f6a90 100644 (file)
@@ -136,13 +136,12 @@ NTSTATUS rpccli_netlogon_setup_creds(struct rpc_pipe_client *cli,
 
        SMB_ASSERT(rpccli_is_pipe_idx(cli, PI_NETLOGON));
 
-       dc = cli->dc;
-       if (!dc) {
-               return NT_STATUS_INVALID_PARAMETER;
+       TALLOC_FREE(cli->dc);
+       cli->dc = talloc_zero(cli, struct dcinfo);
+       if (cli->dc == NULL) {
+               return NT_STATUS_NO_MEMORY;
        }
-
-       /* Ensure we don't reuse any of this state. */
-       ZERO_STRUCTP(dc);
+       dc = cli->dc;
 
        /* Store the machine account password we're going to use. */
        memcpy(dc->mach_pw, machine_pwd, 16);
index af4c28195d26635c617c848cd285ef3f7a90e4ef..2aa96ab414d16a985316ec29cfba1c2ddf4aad98 100644 (file)
@@ -2818,7 +2818,7 @@ NTSTATUS rpc_pipe_open_ncalrpc(TALLOC_CTX *mem_ctx, const char *socket_path,
        struct sockaddr_un addr;
        NTSTATUS status;
 
-       result = talloc(mem_ctx, struct rpc_pipe_client);
+       result = talloc_zero(mem_ctx, struct rpc_pipe_client);
        if (result == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -2847,12 +2847,6 @@ NTSTATUS rpc_pipe_open_ncalrpc(TALLOC_CTX *mem_ctx, const char *socket_path,
 
        talloc_set_destructor(result, rpc_pipe_sock_destructor);
 
-       result->dc = TALLOC_ZERO_P(result, struct dcinfo);
-       if (result->dc == NULL) {
-               status = NT_STATUS_NO_MEMORY;
-               goto fail;
-       }
-
        ZERO_STRUCT(addr);
        addr.sun_family = AF_UNIX;
        strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
@@ -2927,16 +2921,6 @@ static struct rpc_pipe_client *rpc_pipe_open_np(struct cli_state *cli, int pipe_
                return NULL;
        }
 
-       if (pipe_idx == PI_NETLOGON) {
-               /* Set up a netlogon credential chain for a netlogon pipe. */
-               result->dc = TALLOC_ZERO_P(result, struct dcinfo);
-               if (result->dc == NULL) {
-                       *perr = NT_STATUS_NO_MEMORY;
-                       TALLOC_FREE(result);
-                       return NULL;
-               }
-       }
-
        fnum = cli_nt_create(cli, result->trans.np.pipe_name,
                             DESIRED_ACCESS_PIPE);
        if (fnum == -1) {
@@ -3267,9 +3251,15 @@ struct rpc_pipe_client *cli_rpc_pipe_open_schannel_with_key(struct cli_state *cl
                return NULL;
        }
 
-       /* The credentials on a new netlogon pipe are the ones we are passed in - copy them over. */
-       if (result->dc) {
-               *result->dc = *pdc;
+       /*
+        * The credentials on a new netlogon pipe are the ones we are passed
+        * in - copy them over.
+        */
+       result->dc = (struct dcinfo *)talloc_memdup(result, pdc, sizeof(*pdc));
+       if (result->dc == NULL) {
+               DEBUG(0, ("talloc failed\n"));
+               TALLOC_FREE(result);
+               return NULL;
        }
 
        DEBUG(10,("cli_rpc_pipe_open_schannel_with_key: opened pipe %s to machine %s "