Revert "smbd: introduce sconn->sync_thread_pool"
[garming/samba-autobuild/.git] / source3 / smbd / msdfs.c
index 3fba71bb084e07ade5497de3162a1f677707ba4d..5283edbecfcd8997378d31447899033a903993ee 100644 (file)
@@ -28,6 +28,7 @@
 #include "smbd/globals.h"
 #include "msdfs.h"
 #include "auth.h"
+#include "../auth/auth_util.h"
 #include "lib/param/loadparm.h"
 #include "libcli/security/security.h"
 #include "librpc/gen_ndr/ndr_dfsblobs.h"
@@ -263,9 +264,17 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       sconn->ev_ctx = sconn->raw_ev_ctx;
-       sconn->root_ev_ctx = sconn->raw_ev_ctx;
-       sconn->guest_ev_ctx = sconn->raw_ev_ctx;
+       sconn->root_ev_ctx = smbd_impersonate_root_create(sconn->raw_ev_ctx);
+       if (sconn->root_ev_ctx == NULL) {
+               TALLOC_FREE(sconn);
+               return NT_STATUS_NO_MEMORY;
+       }
+       sconn->guest_ev_ctx = smbd_impersonate_guest_create(sconn->raw_ev_ctx);
+       if (sconn->guest_ev_ctx == NULL) {
+               TALLOC_FREE(sconn);
+               return NT_STATUS_NO_MEMORY;
+       }
+
        sconn->msg_ctx = msg;
 
        conn = conn_new(sconn);
@@ -308,13 +317,37 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx,
                        TALLOC_FREE(conn);
                        return NT_STATUS_NO_MEMORY;
                }
-               vfs_user = conn->session_info->unix_info->unix_name;
+               /* unix_info could be NULL in session_info */
+               if (conn->session_info->unix_info != NULL) {
+                       vfs_user = conn->session_info->unix_info->unix_name;
+               } else {
+                       vfs_user = get_current_username();
+               }
        } else {
                /* use current authenticated user in absence of session_info */
                vfs_user = get_current_username();
        }
 
-       conn->user_ev_ctx = sconn->raw_ev_ctx;
+       /*
+        * The impersonation has to be done by the caller
+        * of create_conn_struct_tos[_cwd]().
+        *
+        * Note: the context can't be changed anyway
+        * as we're using our own tevent_context
+        * and not a global one were other requests
+        * could change the current unix token.
+        *
+        * We just use a wrapper tevent_context in order
+        * to avoid crashes because TALLOC_FREE(conn->user_ev_ctx)
+        * would also remove sconn->raw_ev_ctx.
+        */
+       conn->user_ev_ctx = smbd_impersonate_debug_create(sconn->raw_ev_ctx,
+                                                         "FAKE impersonation",
+                                                         DBGLVL_DEBUG);
+       if (conn->user_ev_ctx == NULL) {
+               TALLOC_FREE(conn);
+               return NT_STATUS_NO_MEMORY;
+       }
 
        set_conn_connectpath(conn, connpath);
 
@@ -1106,7 +1139,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
                return NT_STATUS_OK;
        }
 
-       status = create_conn_struct_tos_cwd(server_messaging_context(),
+       status = create_conn_struct_tos_cwd(global_messaging_context(),
                                            snum,
                                            lp_path(frame, snum),
                                            NULL,
@@ -1320,7 +1353,7 @@ static bool junction_to_local_path_tos(const struct junction_map *jucn,
        if(snum < 0) {
                return False;
        }
-       status = create_conn_struct_tos_cwd(server_messaging_context(),
+       status = create_conn_struct_tos_cwd(global_messaging_context(),
                                            snum,
                                            lp_path(talloc_tos(), snum),
                                            NULL,
@@ -1490,7 +1523,7 @@ static int count_dfs_links(TALLOC_CTX *ctx, int snum)
         * Fake up a connection struct for the VFS layer.
         */
 
-       status = create_conn_struct_tos_cwd(server_messaging_context(),
+       status = create_conn_struct_tos_cwd(global_messaging_context(),
                                            snum,
                                            connect_path,
                                            NULL,
@@ -1587,7 +1620,7 @@ static int form_junctions(TALLOC_CTX *ctx,
         * Fake up a connection struct for the VFS layer.
         */
 
-       status = create_conn_struct_tos_cwd(server_messaging_context(),
+       status = create_conn_struct_tos_cwd(global_messaging_context(),
                                            snum,
                                            connect_path,
                                            NULL,