rpc: Always supply both the remote and local address to the auth subsystem
authorGary Lockyer <gary@catalyst.net.nz>
Fri, 24 Feb 2017 00:29:12 +0000 (13:29 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 29 Mar 2017 00:37:27 +0000 (02:37 +0200)
This ensures that gensec, and then the NTLM auth subsystem under it, always gets the
remote and local address pointers for potential logging.

The local address allows us to know which interface an authentication is on

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Pair-Programmed-by: Gary Lockyer <gary@catalyst.net.nz>
Signed-off-by: Gary Lockyer <gary@catalyst.net.nz>
20 files changed:
source3/auth/auth_ntlmssp.c
source3/auth/auth_util.c
source3/auth/proto.h
source3/auth/user_info.c
source3/librpc/rpc/dcerpc_ep.c
source3/printing/nt_printing_migrate_internal.c
source3/printing/printspoolss.c
source3/rpc_client/cli_winreg_int.c
source3/rpc_server/netlogon/srv_netlog_nt.c
source3/rpc_server/rpc_ncacn_np.c
source3/rpc_server/rpc_ncacn_np.h
source3/rpc_server/rpc_server.c
source3/rpc_server/spoolss/srv_spoolss_util.c
source3/smbd/lanman.c
source3/smbd/reply.c
source3/smbd/sesssetup.c
source3/torture/pdbtest.c
source3/winbindd/winbindd_cm.c
source3/winbindd/winbindd_pam.c
source4/rpc_server/dcesrv_auth.c

index 95749ef7a9f7461426ce2678f53c832cd0b8d9c0..fd629fd9a0304ab5fdf1a9a0c2ce570c3bc68298 100644 (file)
@@ -169,6 +169,7 @@ NTSTATUS auth3_check_password(struct auth4_context *auth4_context,
                                       user_info->client.domain_name,
                                       user_info->workstation_name,
                                       user_info->remote_host,
+                                      user_info->local_host,
                                       user_info->service_description,
                                       user_info->password.response.lanman.data ? &user_info->password.response.lanman : NULL,
                                       user_info->password.response.nt.data ? &user_info->password.response.nt : NULL,
index d015165249ea40c0c975af6ea040a698232ecc6d..ffd60e0b4670c21c0e1c1013d0b2573f1af4535a 100644 (file)
@@ -97,6 +97,7 @@ NTSTATUS make_user_info_map(TALLOC_CTX *mem_ctx,
                            const char *client_domain,
                            const char *workstation_name,
                            const struct tsocket_address *remote_address,
+                           const struct tsocket_address *local_address,
                            const char *service_description,
                            const DATA_BLOB *lm_pwd,
                            const DATA_BLOB *nt_pwd,
@@ -151,8 +152,8 @@ NTSTATUS make_user_info_map(TALLOC_CTX *mem_ctx,
 
        result = make_user_info(mem_ctx, user_info, smb_name, internal_username,
                                client_domain, domain, workstation_name,
-                               remote_address, service_description,
-                               lm_pwd, nt_pwd,
+                               remote_address, local_address,
+                               service_description, lm_pwd, nt_pwd,
                                lm_interactive_pwd, nt_interactive_pwd,
                                plaintext, password_state);
        if (NT_STATUS_IS_OK(result)) {
@@ -175,6 +176,7 @@ bool make_user_info_netlogon_network(TALLOC_CTX *mem_ctx,
                                     const char *client_domain, 
                                     const char *workstation_name,
                                     const struct tsocket_address *remote_address,
+                                    const struct tsocket_address *local_address,
                                     uint32_t logon_parameters,
                                     const uchar *lm_network_pwd,
                                     int lm_pwd_len,
@@ -190,6 +192,7 @@ bool make_user_info_netlogon_network(TALLOC_CTX *mem_ctx,
                                    smb_name, client_domain, 
                                    workstation_name,
                                    remote_address,
+                                   local_address,
                                    "SamLogon",
                                    lm_pwd_len ? &lm_blob : NULL, 
                                    nt_pwd_len ? &nt_blob : NULL,
@@ -217,6 +220,7 @@ bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
                                         const char *client_domain, 
                                         const char *workstation_name,
                                         const struct tsocket_address *remote_address,
+                                        const struct tsocket_address *local_address,
                                         uint32_t logon_parameters,
                                         const uchar chal[8], 
                                         const uchar lm_interactive_pwd[16], 
@@ -262,6 +266,7 @@ bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
                        user_info, 
                        smb_name, client_domain, workstation_name,
                        remote_address,
+                       local_address,
                        "SamLogon",
                        lm_interactive_pwd ? &local_lm_blob : NULL,
                        nt_interactive_pwd ? &local_nt_blob : NULL,
@@ -290,6 +295,7 @@ bool make_user_info_for_reply(TALLOC_CTX *mem_ctx,
                              const char *smb_name, 
                              const char *client_domain,
                              const struct tsocket_address *remote_address,
+                             const struct tsocket_address *local_address,
                              const char *service_description,
                              const uint8_t chal[8],
                              DATA_BLOB plaintext_password)
@@ -338,6 +344,7 @@ bool make_user_info_for_reply(TALLOC_CTX *mem_ctx,
                user_info, smb_name, smb_name, client_domain, client_domain, 
                get_remote_machine_name(),
                remote_address,
+               local_address,
                service_description,
                local_lm_blob.data ? &local_lm_blob : NULL,
                local_nt_blob.data ? &local_nt_blob : NULL,
@@ -363,6 +370,7 @@ NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
                                       const char *smb_name,
                                       const char *client_domain,
                                      const struct tsocket_address *remote_address,
+                                     const struct tsocket_address *local_address,
                                      const char *service_description,
                                      DATA_BLOB lm_resp, DATA_BLOB nt_resp)
 {
@@ -382,9 +390,10 @@ NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
 
        return make_user_info(mem_ctx,
                              user_info, smb_name, smb_name,
-                             client_domain, client_domain, 
+                             client_domain, client_domain,
                              get_remote_machine_name(),
                              remote_address,
+                             local_address,
                              service_description,
                              lm_resp.data && (lm_resp.length > 0) ? &lm_resp : NULL,
                              nt_resp.data && (nt_resp.length > 0) ? &nt_resp : NULL,
@@ -398,6 +407,7 @@ NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
 
 bool make_user_info_guest(TALLOC_CTX *mem_ctx,
                          const struct tsocket_address *remote_address,
+                         const struct tsocket_address *local_address,
                          const char *service_description,
                          struct auth_usersupplied_info **user_info)
 {
@@ -409,6 +419,7 @@ bool make_user_info_guest(TALLOC_CTX *mem_ctx,
                                   "","", 
                                   "", 
                                   remote_address,
+                                  local_address,
                                   service_description,
                                   NULL, NULL, 
                                   NULL, NULL, 
index 400875f05914563553118b63901fa211c4a7770e..348b882dc761dab33c24fb147be2f644898f8445 100644 (file)
@@ -164,6 +164,7 @@ NTSTATUS make_user_info_map(TALLOC_CTX *mem_ctx,
                            const char *client_domain,
                            const char *workstation_name,
                            const struct tsocket_address *remote_address,
+                           const struct tsocket_address *local_address,
                            const char *service_description,
                            const DATA_BLOB *lm_pwd,
                            const DATA_BLOB *nt_pwd,
@@ -177,6 +178,7 @@ bool make_user_info_netlogon_network(TALLOC_CTX *mem_ctx,
                                     const char *client_domain,
                                     const char *workstation_name,
                                     const struct tsocket_address *remote_address,
+                                    const struct tsocket_address *local_address,
                                     uint32_t logon_parameters,
                                     const uchar *lm_network_pwd,
                                     int lm_pwd_len,
@@ -188,6 +190,7 @@ bool make_user_info_netlogon_interactive(TALLOC_CTX *mem_ctx,
                                         const char *client_domain,
                                         const char *workstation_name,
                                         const struct tsocket_address *remote_address,
+                                        const struct tsocket_address *local_address,
                                         uint32_t logon_parameters,
                                         const uchar chal[8],
                                         const uchar lm_interactive_pwd[16],
@@ -197,6 +200,7 @@ bool make_user_info_for_reply(TALLOC_CTX *mem_ctx,
                              const char *smb_name,
                              const char *client_domain,
                              const struct tsocket_address *remote_address,
+                             const struct tsocket_address *local_address,
                              const char *service_description,
                              const uint8_t chal[8],
                              DATA_BLOB plaintext_password);
@@ -205,10 +209,12 @@ NTSTATUS make_user_info_for_reply_enc(TALLOC_CTX *mem_ctx,
                                       const char *smb_name,
                                       const char *client_domain,
                                      const struct tsocket_address *remote_address,
+                                     const struct tsocket_address *local_address,
                                      const char *service_description,
                                       DATA_BLOB lm_resp, DATA_BLOB nt_resp);
 bool make_user_info_guest(TALLOC_CTX *mem_ctx,
                          const struct tsocket_address *remote_address,
+                         const struct tsocket_address *local_address,
                          const char *service_description,
                          struct auth_usersupplied_info **user_info);
 
@@ -278,6 +284,7 @@ NTSTATUS make_user_info(TALLOC_CTX *mem_ctx,
                        const char *domain,
                        const char *workstation_name,
                        const struct tsocket_address *remote_address,
+                       const struct tsocket_address *local_address,
                        const char *service_description,
                        const DATA_BLOB *lm_pwd,
                        const DATA_BLOB *nt_pwd,
index c410d222af5017833ce077c4a1492dcbcb97dcdd..c79cc0c4f35d0f9f9d9e23951a0bc110c70c48c9 100644 (file)
@@ -49,6 +49,7 @@ NTSTATUS make_user_info(TALLOC_CTX *mem_ctx,
                        const char *domain,
                        const char *workstation_name,
                        const struct tsocket_address *remote_address,
+                       const struct tsocket_address *local_address,
                        const char *service_description,
                        const DATA_BLOB *lm_pwd,
                        const DATA_BLOB *nt_pwd,
@@ -106,6 +107,15 @@ NTSTATUS make_user_info(TALLOC_CTX *mem_ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
+       if (local_address != NULL) {
+               user_info->local_host = tsocket_address_copy(local_address,
+                                                            user_info);
+               if (user_info->local_host == NULL) {
+                       TALLOC_FREE(user_info);
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
        user_info->service_description = talloc_strdup(user_info, service_description);
        if (user_info->service_description == NULL) {
                TALLOC_FREE(user_info);
index 0502557a6621178fe4cf2e381cb278cd85d71d42..da26fab76ae987bef585a7c52dab60dd32cf26cf 100644 (file)
@@ -382,6 +382,7 @@ static NTSTATUS ep_register(TALLOC_CTX *mem_ctx,
                status = rpcint_binding_handle(tmp_ctx,
                                               &ndr_table_epmapper,
                                               local,
+                                              NULL,
                                               get_session_info_system(),
                                               msg_ctx,
                                               &h);
index 34133b27a58ddd9002799beae86f56821ba7afbc..dd78e69989e739b67edd5f9e30ae38071d8b74e3 100644 (file)
@@ -227,6 +227,7 @@ bool nt_printing_tdb_migrate(struct messaging_context *msg_ctx)
                                        &ndr_table_winreg,
                                        session_info,
                                        NULL,
+                                       NULL,
                                        msg_ctx,
                                        &winreg_pipe);
        if (!NT_STATUS_IS_OK(status)) {
index e92f4613ba5761aa3b22a7091f3b8ca119a5fc6f..60002020351e9c80f2c76b610cdb16834a08fb2a 100644 (file)
@@ -154,6 +154,7 @@ NTSTATUS print_spool_open(files_struct *fsp,
                                         &ndr_table_spoolss,
                                         fsp->conn->session_info,
                                         fsp->conn->sconn->remote_address,
+                                        fsp->conn->sconn->local_address,
                                         fsp->conn->sconn->msg_ctx,
                                         &fsp->conn->spoolss_pipe);
        if (!NT_STATUS_IS_OK(status)) {
@@ -343,6 +344,7 @@ void print_spool_terminate(struct connection_struct *conn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &conn->spoolss_pipe);
        if (!NT_STATUS_IS_OK(status)) {
index ac04460ae159f11e3eefb10a214c921a61c699a8..3ac8380bf7c22ac42a2fb75ad0893bec8960250f 100644 (file)
@@ -115,6 +115,7 @@ static NTSTATUS _winreg_int_openkey(TALLOC_CTX *mem_ctx,
        status = rpcint_binding_handle(mem_ctx,
                                       &ndr_table_winreg,
                                       local,
+                                      NULL,
                                       session_info,
                                       msg_ctx,
                                       &binding_handle);
index 38d7bda9822a37178312d22d3df93792279fca87..6a42f345c537667009d55e3ecb381ac37743b531 100644 (file)
@@ -423,6 +423,7 @@ NTSTATUS _netr_NetrEnumerateTrustedDomains(struct pipes_struct *p,
        status = rpcint_binding_handle(p->mem_ctx,
                                       &ndr_table_lsarpc,
                                       p->remote_address,
+                                      p->local_address,
                                       p->session_info,
                                       p->msg_ctx,
                                       &h);
@@ -703,6 +704,7 @@ static NTSTATUS get_md4pw(struct samr_Password *md4pw, const char *mach_acct,
        status = rpcint_binding_handle(mem_ctx,
                                       &ndr_table_samr,
                                       local,
+                                      NULL,
                                       session_info,
                                       msg_ctx,
                                       &h);
@@ -1181,6 +1183,7 @@ static NTSTATUS netr_set_machine_account_password(TALLOC_CTX *mem_ctx,
        status = rpcint_binding_handle(mem_ctx,
                                       &ndr_table_samr,
                                       local,
+                                      NULL,
                                       session_info,
                                       msg_ctx,
                                       &h);
@@ -1611,6 +1614,7 @@ static NTSTATUS _netr_LogonSamLogon_base(struct pipes_struct *p,
                                                     nt_username, nt_domain,
                                                     wksname,
                                                     p->remote_address,
+                                                    p->local_address,
                                                     logon->network->identity_info.parameter_control,
                                                     logon->network->lm.data,
                                                     logon->network->lm.length,
@@ -1665,6 +1669,7 @@ static NTSTATUS _netr_LogonSamLogon_base(struct pipes_struct *p,
                                                         nt_username, nt_domain,
                                                         nt_workstation,
                                                         p->remote_address,
+                                                        p->local_address,
                                                         logon->password->identity_info.parameter_control,
                                                         chal,
                                                         logon->password->lmpassword.hash,
index cb3b8e643403cac55dac65220cfc3a1a4a46ab00..121e776b90c948738a696f42e63287989ed5ac62 100644 (file)
@@ -183,6 +183,7 @@ out:
 struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
                                              const struct ndr_syntax_id *syntax,
                                              const struct tsocket_address *remote_address,
+                                             const struct tsocket_address *local_address,
                                              const struct auth_session_info *session_info,
                                              struct messaging_context *msg_ctx)
 {
@@ -204,7 +205,7 @@ struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
 
        ret = make_base_pipes_struct(mem_ctx, msg_ctx, pipe_name,
                                     NCALRPC, RPC_LITTLE_ENDIAN,
-                                    remote_address, NULL, &p);
+                                    remote_address, local_address, &p);
        if (ret) {
                DEBUG(0,("ERROR! no memory for pipes_struct!\n"));
                return NULL;
@@ -492,6 +493,7 @@ static NTSTATUS rpcint_binding_handle_ex(TALLOC_CTX *mem_ctx,
                        const struct ndr_syntax_id *abstract_syntax,
                        const struct ndr_interface_table *ndr_table,
                        const struct tsocket_address *remote_address,
+                       const struct tsocket_address *local_address,
                        const struct auth_session_info *session_info,
                        struct messaging_context *msg_ctx,
                        struct dcerpc_binding_handle **binding_handle)
@@ -516,6 +518,7 @@ static NTSTATUS rpcint_binding_handle_ex(TALLOC_CTX *mem_ctx,
        hs->p = make_internal_rpc_pipe_p(hs,
                                         abstract_syntax,
                                         remote_address,
+                                        local_address,
                                         session_info,
                                         msg_ctx);
        if (hs->p == NULL) {
@@ -560,12 +563,14 @@ static NTSTATUS rpcint_binding_handle_ex(TALLOC_CTX *mem_ctx,
 NTSTATUS rpcint_binding_handle(TALLOC_CTX *mem_ctx,
                               const struct ndr_interface_table *ndr_table,
                               const struct tsocket_address *remote_address,
+                              const struct tsocket_address *local_address,
                               const struct auth_session_info *session_info,
                               struct messaging_context *msg_ctx,
                               struct dcerpc_binding_handle **binding_handle)
 {
        return rpcint_binding_handle_ex(mem_ctx, NULL, ndr_table, remote_address,
-                                       session_info, msg_ctx, binding_handle);
+                                       local_address, session_info,
+                                       msg_ctx, binding_handle);
 }
 
 /**
@@ -596,6 +601,7 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx,
                                const struct ndr_interface_table *ndr_table,
                                const struct auth_session_info *session_info,
                                const struct tsocket_address *remote_address,
+                               const struct tsocket_address *local_address,
                                struct messaging_context *msg_ctx,
                                struct rpc_pipe_client **presult)
 {
@@ -632,6 +638,7 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx,
        status = rpcint_binding_handle(result,
                                       ndr_table,
                                       remote_address,
+                                      local_address,
                                       session_info,
                                       msg_ctx,
                                       &result->binding_handle);
@@ -1033,6 +1040,7 @@ NTSTATUS rpc_pipe_open_interface(TALLOC_CTX *mem_ctx,
                                 const struct ndr_interface_table *table,
                                 const struct auth_session_info *session_info,
                                 const struct tsocket_address *remote_address,
+                                const struct tsocket_address *local_address,
                                 struct messaging_context *msg_ctx,
                                 struct rpc_pipe_client **cli_pipe)
 {
@@ -1074,7 +1082,8 @@ NTSTATUS rpc_pipe_open_interface(TALLOC_CTX *mem_ctx,
        case RPC_SERVICE_MODE_EMBEDDED:
                status = rpc_pipe_open_internal(tmp_ctx,
                                                table, session_info,
-                                               remote_address, msg_ctx,
+                                               remote_address, local_address,
+                                               msg_ctx,
                                                &cli);
                if (!NT_STATUS_IS_OK(status)) {
                        goto done;
index 59b9d5a787eb9b7deb5628da9ba0520a46c4b7e7..2ae126dec9edf44d147257559aca87627e6338b4 100644 (file)
@@ -65,6 +65,7 @@ struct np_proxy_state {
 struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
                                              const struct ndr_syntax_id *syntax,
                                              const struct tsocket_address *remote_address,
+                                             const struct tsocket_address *local_address,
                                              const struct auth_session_info *session_info,
                                              struct messaging_context *msg_ctx);
 struct np_proxy_state *make_external_rpc_pipe_p(TALLOC_CTX *mem_ctx,
@@ -75,6 +76,7 @@ struct np_proxy_state *make_external_rpc_pipe_p(TALLOC_CTX *mem_ctx,
 NTSTATUS rpcint_binding_handle(TALLOC_CTX *mem_ctx,
                               const struct ndr_interface_table *ndr_table,
                               const struct tsocket_address *remote_address,
+                              const struct tsocket_address *local_address,
                               const struct auth_session_info *session_info,
                               struct messaging_context *msg_ctx,
                               struct dcerpc_binding_handle **binding_handle);
@@ -82,6 +84,7 @@ NTSTATUS rpc_pipe_open_interface(TALLOC_CTX *mem_ctx,
                                 const struct ndr_interface_table *table,
                                 const struct auth_session_info *session_info,
                                 const struct tsocket_address *remote_address,
+                                const struct tsocket_address *local_address,
                                 struct messaging_context *msg_ctx,
                                 struct rpc_pipe_client **cli_pipe);
 
@@ -89,6 +92,7 @@ NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx,
                                const struct ndr_interface_table *ndr_table,
                                const struct auth_session_info *session_info,
                                const struct tsocket_address *remote_address,
+                               const struct tsocket_address *local_address,
                                struct messaging_context *msg_ctx,
                                struct rpc_pipe_client **presult);
 
index 6c988cea7dcead1b69ade5962a4b2519b7131d3f..21504c0eeed1c872690da84189c77d05a61ddc0e 100644 (file)
@@ -872,14 +872,18 @@ static void dcerpc_ncalrpc_listener(struct tevent_context *ev,
        struct dcerpc_ncacn_listen_state *state =
                        talloc_get_type_abort(private_data,
                                              struct dcerpc_ncacn_listen_state);
-       struct tsocket_address *cli_addr = NULL;
+       struct tsocket_address *cli_addr = NULL, *srv_addr = NULL;
        struct sockaddr_un sunaddr;
        struct sockaddr *addr = (struct sockaddr *)(void *)&sunaddr;
        socklen_t len = sizeof(sunaddr);
+       struct sockaddr_un sunaddr_server;
+       struct sockaddr *addr_server = (struct sockaddr *)(void *)&sunaddr_server;
+       socklen_t len_server = sizeof(sunaddr_server);
        int sd = -1;
        int rc;
 
        ZERO_STRUCT(sunaddr);
+       ZERO_STRUCT(sunaddr_server);
 
        sd = accept(state->fd, addr, &len);
        if (sd == -1) {
@@ -897,13 +901,29 @@ static void dcerpc_ncalrpc_listener(struct tevent_context *ev,
                return;
        }
 
-       DEBUG(10, ("Accepted ncalrpc socket %d\n", sd));
+       rc = getsockname(sd, addr_server, &len_server);
+       if (rc < 0) {
+               close(sd);
+               return;
+       }
+
+       rc = tsocket_address_bsd_from_sockaddr(state,
+                                              addr_server,
+                                              len_server,
+                                              &srv_addr);
+       if (rc < 0) {
+               close(sd);
+               return;
+       }
+
+       DEBUG(10, ("Accepted ncalrpc socket %s (fd: %d)\n",
+                  sunaddr.sun_path, sd));
 
        dcerpc_ncacn_accept(state->ev_ctx,
                            state->msg_ctx,
                            NCALRPC,
                            state->ep.name,
-                           cli_addr, NULL, sd,
+                           cli_addr, srv_addr, sd,
                            state->disconnect_fn);
 }
 
@@ -977,7 +997,7 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
                                                  ncacn_conn);
        }
        if (ncacn_conn->client_name == NULL) {
-               DEBUG(0, ("Out of memory!\n"));
+               DEBUG(0, ("Out of memory obtaining remote socket address as a string!\n"));
                talloc_free(ncacn_conn);
                close(s);
                return;
@@ -986,11 +1006,17 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
        if (srv_addr != NULL) {
                ncacn_conn->server = talloc_move(ncacn_conn, &srv_addr);
 
-               ncacn_conn->server_name =
-                       tsocket_address_inet_addr_string(ncacn_conn->server,
-                                                        ncacn_conn);
+               if (tsocket_address_is_inet(ncacn_conn->server, "ip")) {
+                       ncacn_conn->server_name =
+                               tsocket_address_inet_addr_string(ncacn_conn->server,
+                                                                ncacn_conn);
+               } else {
+                       ncacn_conn->server_name =
+                               tsocket_address_unix_path(ncacn_conn->server,
+                                                         ncacn_conn);
+               }
                if (ncacn_conn->server_name == NULL) {
-                       DEBUG(0, ("Out of memory!\n"));
+                       DEBUG(0, ("Out of memory obtaining local socket address as a string!\n"));
                        talloc_free(ncacn_conn);
                        close(s);
                        return;
@@ -1021,7 +1047,7 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
                                                                            "/root/ncalrpc_as_system",
                                                                            &ncacn_conn->client);
                                        if (rc < 0) {
-                                               DEBUG(0, ("Out of memory!\n"));
+                                               DEBUG(0, ("Out of memory building magic ncalrpc_as_system path!\n"));
                                                talloc_free(ncacn_conn);
                                                close(s);
                                                return;
@@ -1031,7 +1057,7 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
                                        ncacn_conn->client_name = tsocket_address_unix_path(ncacn_conn->client,
                                                                                            ncacn_conn);
                                        if (ncacn_conn->client == NULL) {
-                                               DEBUG(0, ("Out of memory!\n"));
+                                               DEBUG(0, ("Out of memory getting magic ncalrpc_as_system string!\n"));
                                                talloc_free(ncacn_conn);
                                                close(s);
                                                return;
@@ -1110,7 +1136,7 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
        ncacn_conn->send_queue = tevent_queue_create(ncacn_conn,
                                                        "dcerpc send queue");
        if (ncacn_conn->send_queue == NULL) {
-               DEBUG(0, ("Out of memory!\n"));
+               DEBUG(0, ("Out of memory building dcerpc send queue!\n"));
                talloc_free(ncacn_conn);
                return;
        }
index 32f0e274598f0cdc8149acda1a18d345f01422b6..17acf515eb964d1ebf6af3aa57f005238c3029d6 100644 (file)
@@ -48,6 +48,7 @@ WERROR winreg_printer_binding_handle(TALLOC_CTX *mem_ctx,
        status = rpcint_binding_handle(mem_ctx,
                                       &ndr_table_winreg,
                                       local,
+                                      NULL,
                                       session_info,
                                       msg_ctx,
                                       winreg_binding_handle);
index 995ed081f624f03a47f9295489905655965e4218..c3e540ff8106994aa0f6bfa23d732ecb61670723 100644 (file)
@@ -835,6 +835,7 @@ static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -1032,6 +1033,7 @@ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -2266,6 +2268,7 @@ static bool api_RNetShareAdd(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc,
                                        conn->session_info,
                                        conn->sconn->remote_address,
+                                       conn->sconn->local_address,
                                        conn->sconn->msg_ctx,
                                        &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -2377,7 +2380,7 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr,
                conn->session_info, conn->sconn->remote_address,
-               conn->sconn->msg_ctx, &samr_pipe);
+               conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
                          nt_errstr(status)));
@@ -2583,7 +2586,7 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr,
                conn->session_info, conn->sconn->remote_address,
-               conn->sconn->msg_ctx, &samr_pipe);
+               conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
                          nt_errstr(status)));
@@ -2783,7 +2786,7 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(
                talloc_tos(), &ndr_table_samr,
                conn->session_info, conn->sconn->remote_address,
-               conn->sconn->msg_ctx, &samr_pipe);
+               conn->sconn->local_address, conn->sconn->msg_ctx, &samr_pipe);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n",
                          nt_errstr(status)));
@@ -3047,6 +3050,7 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr,
                                        conn->session_info,
                                        conn->sconn->remote_address,
+                                       conn->sconn->local_address,
                                        conn->sconn->msg_ctx,
                                        &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3144,6 +3148,7 @@ static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3272,6 +3277,7 @@ static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3454,6 +3460,7 @@ static bool api_PrintJobInfo(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -3631,6 +3638,7 @@ static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc,
                                        conn->session_info,
                                        conn->sconn->remote_address,
+                                       conn->sconn->local_address,
                                        conn->sconn->msg_ctx,
                                        &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4067,6 +4075,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn,
        status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr,
                                        conn->session_info,
                                        conn->sconn->remote_address,
+                                       conn->sconn->local_address,
                                        conn->sconn->msg_ctx,
                                        &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4596,6 +4605,7 @@ static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4738,6 +4748,7 @@ static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -4938,6 +4949,7 @@ static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -5070,6 +5082,7 @@ static bool api_WPrintDestEnum(struct smbd_server_connection *sconn,
                                         &ndr_table_spoolss,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
@@ -5381,6 +5394,7 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
                                         &ndr_table_srvsvc,
                                         conn->session_info,
                                         conn->sconn->remote_address,
+                                        conn->sconn->local_address,
                                         conn->sconn->msg_ctx,
                                         &cli);
        if (!NT_STATUS_IS_OK(status)) {
index 0979e6eb9566526bd5daab8e2cceb2b7806bfb72..030f011157602bdbc8e7f21dc59d3be6fa17813b 100644 (file)
@@ -5956,6 +5956,7 @@ void reply_printqueue(struct smb_request *req)
                                                 &ndr_table_spoolss,
                                                 conn->session_info,
                                                 conn->sconn->remote_address,
+                                                conn->sconn->local_address,
                                                 conn->sconn->msg_ctx,
                                                 &cli);
                if (!NT_STATUS_IS_OK(status)) {
index 3a283b9d575ad9360c429b2baa023156bec4a39c..0cc49d916f83dfa00a670f7b8f720f3ee0eaa0ef 100644 (file)
@@ -79,6 +79,7 @@ static int push_signature(uint8_t **outbuf)
 ****************************************************************************/
 
 static NTSTATUS check_guest_password(const struct tsocket_address *remote_address,
+                                    const struct tsocket_address *local_address,
                                     TALLOC_CTX *mem_ctx, 
                                     struct auth_session_info **session_info)
 {
@@ -97,8 +98,8 @@ static NTSTATUS check_guest_password(const struct tsocket_address *remote_addres
        auth_context->get_ntlm_challenge(auth_context,
                                         chal);
 
-       if (!make_user_info_guest(talloc_tos(), remote_address, "SMB",
-                                 &user_info)) {
+       if (!make_user_info_guest(talloc_tos(), remote_address, local_address,
+                                 "SMB", &user_info)) {
                TALLOC_FREE(auth_context);
                return NT_STATUS_NO_MEMORY;
        }
@@ -884,7 +885,9 @@ void reply_sesssetup_and_X(struct smb_request *req)
 
        if (!*user) {
 
-               nt_status = check_guest_password(sconn->remote_address, req, &session_info);
+               nt_status = check_guest_password(sconn->remote_address,
+                                                sconn->local_address,
+                                                req, &session_info);
 
        } else if (doencrypt) {
                struct auth4_context *negprot_auth_context = NULL;
@@ -901,6 +904,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
                                                         &user_info, user,
                                                         domain,
                                                         sconn->remote_address,
+                                                        sconn->local_address,
                                                         "SMB",
                                                         lm_resp, nt_resp);
                user_info->auth_description = "bare-NTLM";
@@ -925,6 +929,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
                                                      &user_info,
                                                      user, domain,
                                                      sconn->remote_address,
+                                                     sconn->local_address,
                                                      "SMB",
                                                      chal,
                                                      plaintext_password)) {
index f794575371e49b87ab386373e21f3bce2c33a5e5..251dbbfd761375dd4dbc126f8732ce308597dc60 100644 (file)
@@ -261,7 +261,8 @@ static bool test_auth(TALLOC_CTX *mem_ctx, struct samu *pdb_entry)
        struct auth_context *auth_context;
        static const uint8_t challenge_8[8] = {1, 2, 3, 4, 5, 6, 7, 8};
        DATA_BLOB challenge = data_blob_const(challenge_8, sizeof(challenge_8));
-       struct tsocket_address *tsocket_address;
+       struct tsocket_address *remote_address;
+       struct tsocket_address *local_address;
        unsigned char local_nt_response[24];
        DATA_BLOB nt_resp = data_blob_const(local_nt_response, sizeof(local_nt_response));
        unsigned char local_nt_session_key[16];
@@ -275,14 +276,18 @@ static bool test_auth(TALLOC_CTX *mem_ctx, struct samu *pdb_entry)
                      local_nt_response);
        SMBsesskeygen_ntv1(pdb_get_nt_passwd(pdb_entry), local_nt_session_key);
 
-       if (tsocket_address_inet_from_strings(NULL, "ip", NULL, 0, &tsocket_address) != 0) {
+       if (tsocket_address_inet_from_strings(NULL, "ip", NULL, 0, &remote_address) != 0) {
                return False;
        }
-       
+
+       if (tsocket_address_inet_from_strings(NULL, "ip", NULL, 0, &local_address) != 0) {
+               return False;
+       }
+
        status = make_user_info(mem_ctx,
                                &user_info, pdb_get_username(pdb_entry), pdb_get_username(pdb_entry),
-                               pdb_get_domain(pdb_entry), pdb_get_domain(pdb_entry), lp_netbios_name(), 
-                               tsocket_address, "pdbtest",
+                               pdb_get_domain(pdb_entry), pdb_get_domain(pdb_entry), lp_netbios_name(),
+                               remote_address,local_address, "pdbtest",
                                NULL, &nt_resp, NULL, NULL, NULL,
                                AUTH_PASSWORD_RESPONSE);
        if (!NT_STATUS_IS_OK(status)) {
index 3df4af3ff10ad3b141fdda5ea0015d18b792e324..157a19374b39b4081d8fce05fb53b32e94e6e2a7 100644 (file)
@@ -1778,6 +1778,7 @@ NTSTATUS wb_open_internal_pipe(TALLOC_CTX *mem_ctx,
                                                 table,
                                                 session_info,
                                                 NULL,
+                                                NULL,
                                                 winbind_messaging_context(),
                                                 &cli);
        } else {
@@ -1785,6 +1786,7 @@ NTSTATUS wb_open_internal_pipe(TALLOC_CTX *mem_ctx,
                                                table,
                                                session_info,
                                                NULL,
+                                               NULL,
                                                winbind_messaging_context(),
                                                &cli);
        }
index 101f8d474680222a8979765bf01686792898006d..606e6de0012245c95734b534a0954563eabd5449 100644 (file)
@@ -1261,7 +1261,7 @@ static NTSTATUS winbindd_dual_auth_passdb(TALLOC_CTX *mem_ctx,
         * here.
         */
        status = make_user_info(frame, &user_info, user, user, domain, domain,
-                               lp_netbios_name(), local,
+                               lp_netbios_name(), local, local,
                                "winbind",
                                lm_resp, nt_resp, NULL, NULL,
                                NULL, AUTH_PASSWORD_RESPONSE);
index 769b52bd00aac4979f99b94961e865307b83b18b..ece314dcbe6ec73c78a72a299aa281cc06123b3c 100644 (file)
@@ -149,6 +149,16 @@ bool dcesrv_auth_bind(struct dcesrv_call_state *call)
                }
        }
 
+       if (call->conn->local_address != NULL) {
+               status = gensec_set_local_address(auth->gensec_security,
+                                                 call->conn->local_address);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(1, ("Failed to call gensec_set_local_address() %s\n",
+                                 nt_errstr(status)));
+                       return false;
+               }
+       }
+
        status = gensec_start_mech_by_authtype(auth->gensec_security, auth->auth_type,
                                               auth->auth_level);
        if (!NT_STATUS_IS_OK(status)) {