From: Ralph Boehme Date: Sun, 29 Dec 2019 07:31:45 +0000 (+0100) Subject: smbd: move homes_snum from struct user_struct to struct smbXsrv_session X-Git-Tag: ldb-2.1.0~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8aae1ef5c0b9c50f892e01316fdac5dc6504ecbb;p=thirdparty%2Fsamba.git smbd: move homes_snum from struct user_struct to struct smbXsrv_session No change in behaviour. A first step in removing user_struct. Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/librpc/idl/smbXsrv.idl b/source3/librpc/idl/smbXsrv.idl index b8f3dc679ea..9fdfc97db0e 100644 --- a/source3/librpc/idl/smbXsrv.idl +++ b/source3/librpc/idl/smbXsrv.idl @@ -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; diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index ee4116c76ba..174e9b2d885 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -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; diff --git a/source3/smbd/service.c b/source3/smbd/service.c index f5c85bb4554..8ff3d415251 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -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); } diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 49576f705da..72fbcf8f418 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -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); } diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c index dad9be78574..ed426b9c09b 100644 --- a/source3/smbd/smb2_sesssetup.c +++ b/source3/smbd/smb2_sesssetup.c @@ -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, diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c index c87bf2ea8d2..0827fb068e6 100644 --- a/source3/smbd/smb2_tcon.c +++ b/source3/smbd/smb2_tcon.c @@ -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) { diff --git a/source3/smbd/smbXsrv_session.c b/source3/smbd/smbXsrv_session.c index 91fa0005737..1bed4ab22e9 100644 --- a/source3/smbd/smbXsrv_session.c +++ b/source3/smbd/smbXsrv_session.c @@ -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,