]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:winbind: Set local and remote addresses in the crafted dcesrv_conn
authorSamuel Cabrero <scabrero@samba.org>
Thu, 17 Feb 2022 11:29:12 +0000 (12:29 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 8 Apr 2022 20:13:37 +0000 (20:13 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/winbindd/winbindd_dual_ndr.c

index aa43849906d947b9d0f575f4867a076f7e65cb90..48b5297f57e237300169703f9c411046d6d38888 100644 (file)
@@ -35,6 +35,7 @@
 #include "rpc_server/rpc_config.h"
 #include "rpc_server/rpc_server.h"
 #include "rpc_dce.h"
+#include "lib/tsocket/tsocket.h"
 
 struct wbint_bh_state {
        struct winbindd_domain *domain;
@@ -449,6 +450,55 @@ fail:
        return status;
 }
 
+static NTSTATUS set_remote_addresses(struct dcesrv_connection *conn,
+                                    int sock)
+{
+       struct sockaddr_storage st = { 0 };
+       struct sockaddr *sar = (struct sockaddr *)&st;
+       struct tsocket_address *remote = NULL;
+       struct tsocket_address *local = NULL;
+       socklen_t sa_len = sizeof(st);
+       NTSTATUS status;
+       int ret;
+
+       ZERO_STRUCT(st);
+       ret = getpeername(sock, sar, &sa_len);
+       if (ret != 0) {
+               status = map_nt_error_from_unix(ret);
+               DBG_ERR("getpeername failed: %s", nt_errstr(status));
+               return status;
+       }
+
+       ret = tsocket_address_bsd_from_sockaddr(conn, sar, sa_len, &remote);
+       if (ret != 0) {
+               status = map_nt_error_from_unix(ret);
+               DBG_ERR("tsocket_address_bsd_from_sockaddr failed: %s",
+                       nt_errstr(status));
+               return status;
+       }
+
+       ZERO_STRUCT(st);
+       ret = getsockname(sock, sar, &sa_len);
+       if (ret != 0) {
+               status = map_nt_error_from_unix(ret);
+               DBG_ERR("getsockname failed: %s", nt_errstr(status));
+               return status;
+       }
+
+       ret = tsocket_address_bsd_from_sockaddr(conn, sar, sa_len, &local);
+       if (ret != 0) {
+               status = map_nt_error_from_unix(ret);
+               DBG_ERR("tsocket_address_bsd_from_sockaddr failed: %s",
+                       nt_errstr(status));
+               return status;
+       }
+
+       conn->local_address = talloc_move(conn, &local);
+       conn->remote_address = talloc_move(conn, &remote);
+
+       return NT_STATUS_OK;
+}
+
 /* initialise a wbint binding handle */
 struct dcerpc_binding_handle *wbint_binding_handle(TALLOC_CTX *mem_ctx,
                                                struct winbindd_domain *domain,
@@ -510,6 +560,11 @@ enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain,
                goto out;
        }
 
+       status = set_remote_addresses(dcesrv_conn, state->sock);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
+
        dcesrv_call = talloc_zero(dcesrv_conn, struct dcesrv_call_state);
        if (dcesrv_call == NULL) {
                status = NT_STATUS_NO_MEMORY;