smbd: move homes_snum from struct user_struct to struct smbXsrv_session
authorRalph Boehme <slow@samba.org>
Sun, 29 Dec 2019 07:31:45 +0000 (08:31 +0100)
committerJeremy Allison <jra@samba.org>
Mon, 13 Jan 2020 19:41:34 +0000 (19:41 +0000)
No change in behaviour. A first step in removing user_struct.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/librpc/idl/smbXsrv.idl
source3/smbd/globals.h
source3/smbd/service.c
source3/smbd/sesssetup.c
source3/smbd/smb2_sesssetup.c
source3/smbd/smb2_tcon.c
source3/smbd/smbXsrv_session.c

index b8f3dc679ea5cd8cf03b94bbd1879aabe6ec2cb9..9fdfc97db0eb378affa3d6fa51ed4c93f40f0358 100644 (file)
@@ -292,6 +292,7 @@ interface smbXsrv
                hyper                                   nonce_low;
                [ignore] user_struct                    *compat;
                [ignore] smbXsrv_tcon_table             *tcon_table;
+               [ignore] uint32                         homes_snum;
                smbXsrv_session_auth0                   *pending_auth;
        } smbXsrv_session;
 
index ee4116c76ba10f4e20186d032099171cf2168a45..174e9b2d8853d63db5a53249e80d8bd791a64955 100644 (file)
@@ -838,8 +838,6 @@ struct user_struct {
        struct user_struct *next, *prev;
        uint64_t vuid; /* Tag for this entry. */
 
-       int homes_snum;
-
        struct auth_session_info *session_info;
 
        struct smbXsrv_session *session;
index f5c85bb455437c84672e408e2c6fef00a8148b19..8ff3d415251f0f61e958aab69d0751886412eadd 100644 (file)
@@ -1029,6 +1029,7 @@ connection_struct *make_connection(struct smb_request *req,
                                   NTSTATUS *status)
 {
        struct smbd_server_connection *sconn = req->sconn;
+       struct smbXsrv_session *session = req->session;
        const struct loadparm_substitution *lp_sub =
                loadparm_s3_global_substitution();
        uid_t euid;
@@ -1064,13 +1065,10 @@ connection_struct *make_connection(struct smb_request *req,
           without too many getpwnam() lookups.  This is particulary nasty for
           winbind usernames, where the share name isn't the same as unix
           username.
-
-          The snum of the homes share is stored on the vuser at session setup
-          time.
        */
 
        if (strequal(service_in,HOMES_NAME)) {
-               if (vuser->homes_snum == -1) {
+               if (session->homes_snum == -1) {
                        DEBUG(2, ("[homes] share not available for "
                                  "this user because it was not found "
                                  "or created at session setup "
@@ -1081,16 +1079,16 @@ connection_struct *make_connection(struct smb_request *req,
                DEBUG(5, ("making a connection to [homes] service "
                          "created at session setup time\n"));
                return make_connection_smb1(req, now,
-                                           vuser->homes_snum,
+                                           session->homes_snum,
                                            vuser,
                                            dev, status);
-       } else if ((vuser->homes_snum != -1)
+       } else if ((session->homes_snum != -1)
                   && strequal(service_in,
-                              lp_const_servicename(vuser->homes_snum))) {
+                              lp_const_servicename(session->homes_snum))) {
                DEBUG(5, ("making a connection to 'homes' service [%s] "
                          "created at session setup time\n", service_in));
                return make_connection_smb1(req, now,
-                                           vuser->homes_snum,
+                                           session->homes_snum,
                                            vuser,
                                            dev, status);
        }
index 49576f705dac7698618ce1f217744870632d4e23..72fbcf8f418c93329ea32190b86a8364cf54defe 100644 (file)
@@ -310,7 +310,6 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                        return;
                }
                session->compat->session = session;
-               session->compat->homes_snum = -1;
                session->compat->session_info = session_info;
                session->compat->vuid = session->global->session_wire_id;
                DLIST_ADD(sconn->users, session->compat);
@@ -318,7 +317,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
 
                if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
                        is_authenticated = true;
-                       session->compat->homes_snum =
+                       session->homes_snum =
                                register_homes_share(session_info->unix_info->unix_name);
                }
 
@@ -419,7 +418,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                session->compat->vuid = session->global->session_wire_id;
 
                if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
-                       session->compat->homes_snum =
+                       session->homes_snum =
                                register_homes_share(session_info->unix_info->unix_name);
                }
 
@@ -1071,7 +1070,6 @@ void reply_sesssetup_and_X(struct smb_request *req)
                return;
        }
        session->compat->session = session;
-       session->compat->homes_snum = -1;
        session->compat->session_info = session_info;
        session->compat->vuid = session->global->session_wire_id;
        DLIST_ADD(sconn->users, session->compat);
@@ -1079,7 +1077,7 @@ void reply_sesssetup_and_X(struct smb_request *req)
 
        if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
                is_authenticated = true;
-               session->compat->homes_snum =
+               session->homes_snum =
                        register_homes_share(session_info->unix_info->unix_name);
        }
 
index dad9be78574e8e908ee5e763692a1d306724fc09..ed426b9c09b9c4bd6eec896ece0ceb06ff2ce74f 100644 (file)
@@ -530,14 +530,13 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
                return NT_STATUS_NO_MEMORY;
        }
        session->compat->session = session;
-       session->compat->homes_snum = -1;
        session->compat->session_info = session_info;
        session->compat->vuid = session->global->session_wire_id;
        DLIST_ADD(smb2req->sconn->users, session->compat);
        smb2req->sconn->num_users++;
 
        if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
-               session->compat->homes_snum =
+               session->homes_snum =
                        register_homes_share(session_info->unix_info->unix_name);
        }
 
@@ -619,7 +618,7 @@ static NTSTATUS smbd_smb2_reauth_generic_return(struct smbXsrv_session *session,
        session->compat->session_info = session_info;
        session->compat->vuid = session->global->session_wire_id;
 
-       session->compat->homes_snum =
+       session->homes_snum =
                        register_homes_share(session_info->unix_info->unix_name);
 
        set_current_user_info(session_info->unix_info->sanitized_username,
index c87bf2ea8d25fb024aee93f16a41df73d7896f36..0827fb068e68cafe4eabea26298951942aaf50b9 100644 (file)
@@ -194,6 +194,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
        const struct loadparm_substitution *lp_sub =
                loadparm_s3_global_substitution();
        struct smbXsrv_connection *conn = req->xconn;
+       struct smbXsrv_session *session = req->session;
        const char *share = in_path;
        char *service = NULL;
        int snum = -1;
@@ -250,7 +251,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
 
        /* TODO: do more things... */
        if (strequal(service,HOMES_NAME)) {
-               if (compat_vuser->homes_snum == -1) {
+               if (session->homes_snum == -1) {
                        DEBUG(2, ("[homes] share not available for "
                                "user %s because it was not found "
                                "or created at session setup "
@@ -258,11 +259,11 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req,
                                compat_vuser->session_info->unix_info->unix_name));
                        return NT_STATUS_BAD_NETWORK_NAME;
                }
-               snum = compat_vuser->homes_snum;
-       } else if ((compat_vuser->homes_snum != -1)
+               snum = session->homes_snum;
+       } else if ((session->homes_snum != -1)
                    && strequal(service,
-                       lp_servicename(talloc_tos(), lp_sub, compat_vuser->homes_snum))) {
-               snum = compat_vuser->homes_snum;
+                       lp_servicename(talloc_tos(), lp_sub, session->homes_snum))) {
+               snum = session->homes_snum;
        } else {
                snum = find_service(talloc_tos(), service, &service);
                if (!service) {
index 91fa0005737c0c12ddcb953c69ec0ae551b95cf1..1bed4ab22e9e8a85117726e9f65f0a541e3dd0eb 100644 (file)
@@ -1234,6 +1234,7 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
        session->idle_time = now;
        session->status = NT_STATUS_MORE_PROCESSING_REQUIRED;
        session->client = conn->client;
+       session->homes_snum = -1;
 
        status = smbXsrv_session_global_allocate(table->global.db_ctx,
                                                 session,