mirror of
https://github.com/samba-team/samba.git
synced 2025-08-03 04:22:09 +03:00
smbd: RIP user_struct
At last, the nail in the coffin. :) Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Mon Jan 13 21:09:01 UTC 2020 on sn-devel-184
This commit is contained in:
committed by
Jeremy Allison
parent
5f85090d78
commit
a18ffe26b3
@ -290,7 +290,6 @@ interface smbXsrv
|
||||
hyper nonce_high_max;
|
||||
hyper nonce_high;
|
||||
hyper nonce_low;
|
||||
[ignore] user_struct *compat;
|
||||
[ignore] smbXsrv_tcon_table *tcon_table;
|
||||
[ignore] uint32 homes_snum;
|
||||
smbXsrv_session_auth0 *pending_auth;
|
||||
|
@ -661,10 +661,6 @@ struct files_struct *file_fsp_get(struct smbd_smb2_request *smb2req,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (smb2req->session->compat == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (smb2req->session->global->session_wire_id != fsp->vuid) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -840,19 +840,10 @@ struct smbd_smb2_request {
|
||||
};
|
||||
|
||||
struct smbd_server_connection;
|
||||
struct user_struct;
|
||||
|
||||
struct pending_message_list;
|
||||
struct pending_auth_data;
|
||||
|
||||
struct user_struct {
|
||||
struct user_struct *next, *prev;
|
||||
|
||||
struct auth_session_info *session_info;
|
||||
|
||||
struct smbXsrv_session *session;
|
||||
};
|
||||
|
||||
struct pthreadpool_tevent;
|
||||
|
||||
struct smbd_server_connection {
|
||||
@ -866,7 +857,6 @@ struct smbd_server_connection {
|
||||
int trans_num;
|
||||
|
||||
size_t num_users;
|
||||
struct user_struct *users;
|
||||
|
||||
size_t num_connections;
|
||||
struct connection_struct *connections;
|
||||
|
@ -26,49 +26,15 @@
|
||||
#include "auth.h"
|
||||
#include "../libcli/security/security.h"
|
||||
|
||||
/****************************************************************************
|
||||
Check if a uid has been validated, and return an pointer to the user_struct
|
||||
if it has. NULL if not. vuid is biased by an offset. This allows us to
|
||||
tell random client vuid's (normally zero) from valid vuids.
|
||||
****************************************************************************/
|
||||
|
||||
struct user_struct *get_valid_user_struct(struct smbd_server_connection *sconn,
|
||||
uint64_t vuid)
|
||||
{
|
||||
struct user_struct *usp;
|
||||
int count=0;
|
||||
|
||||
if (vuid == UID_FIELD_INVALID)
|
||||
return NULL;
|
||||
|
||||
usp=sconn->users;
|
||||
for (;usp;usp=usp->next,count++) {
|
||||
if (vuid == usp->session->global->session_wire_id) {
|
||||
if (count > 10) {
|
||||
DLIST_PROMOTE(sconn->users, usp);
|
||||
}
|
||||
return usp;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Invalidate a uid.
|
||||
****************************************************************************/
|
||||
|
||||
void invalidate_vuid(struct smbd_server_connection *sconn, uint64_t vuid)
|
||||
{
|
||||
struct user_struct *vuser = NULL;
|
||||
struct smbXsrv_session *session = NULL;
|
||||
NTSTATUS status;
|
||||
|
||||
vuser = get_valid_user_struct(sconn, vuid);
|
||||
if (vuser == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
status = get_valid_smbXsrv_session(sconn->client, vuid, &session);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
return;
|
||||
@ -76,15 +42,12 @@ void invalidate_vuid(struct smbd_server_connection *sconn, uint64_t vuid)
|
||||
|
||||
session_yield(session);
|
||||
|
||||
DLIST_REMOVE(sconn->users, vuser);
|
||||
SMB_ASSERT(sconn->num_users > 0);
|
||||
sconn->num_users--;
|
||||
|
||||
/* clear the vuid from the 'cache' on each connection, and
|
||||
from the vuid 'owner' of connections */
|
||||
conn_clear_vuid_caches(sconn, vuid);
|
||||
|
||||
TALLOC_FREE(vuser);
|
||||
}
|
||||
|
||||
int register_homes_share(const char *username)
|
||||
|
@ -754,8 +754,6 @@ struct kernel_oplocks *linux_init_kernel_oplocks(struct smbd_server_connection *
|
||||
|
||||
/* The following definitions come from smbd/password.c */
|
||||
|
||||
struct user_struct *get_valid_user_struct(struct smbd_server_connection *sconn,
|
||||
uint64_t vuid);
|
||||
void invalidate_vuid(struct smbd_server_connection *sconn, uint64_t vuid);
|
||||
int register_homes_share(const char *username);
|
||||
|
||||
|
@ -302,16 +302,6 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
|
||||
data_blob_clear_free(&session_info->session_key);
|
||||
}
|
||||
|
||||
session->compat = talloc_zero(session, struct user_struct);
|
||||
if (session->compat == NULL) {
|
||||
data_blob_free(&out_blob);
|
||||
TALLOC_FREE(session);
|
||||
reply_nterror(req, NT_STATUS_NO_MEMORY);
|
||||
return;
|
||||
}
|
||||
session->compat->session = session;
|
||||
session->compat->session_info = session_info;
|
||||
DLIST_ADD(sconn->users, session->compat);
|
||||
sconn->num_users++;
|
||||
|
||||
if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
|
||||
@ -412,8 +402,6 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
|
||||
talloc_steal(session_info, session_info->session_key.data);
|
||||
TALLOC_FREE(session->global->auth_session_info);
|
||||
|
||||
session->compat->session_info = session_info;
|
||||
|
||||
if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
|
||||
session->homes_snum =
|
||||
register_homes_share(session_info->unix_info->unix_name);
|
||||
@ -1059,16 +1047,6 @@ void reply_sesssetup_and_X(struct smb_request *req)
|
||||
}
|
||||
}
|
||||
|
||||
session->compat = talloc_zero(session, struct user_struct);
|
||||
if (session->compat == NULL) {
|
||||
TALLOC_FREE(session);
|
||||
reply_nterror(req, NT_STATUS_NO_MEMORY);
|
||||
END_PROFILE(SMBsesssetupX);
|
||||
return;
|
||||
}
|
||||
session->compat->session = session;
|
||||
session->compat->session_info = session_info;
|
||||
DLIST_ADD(sconn->users, session->compat);
|
||||
sconn->num_users++;
|
||||
|
||||
if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
|
||||
|
@ -525,13 +525,6 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
|
||||
}
|
||||
talloc_keep_secret(session_info->session_key.data);
|
||||
|
||||
session->compat = talloc_zero(session, struct user_struct);
|
||||
if (session->compat == NULL) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
session->compat->session = session;
|
||||
session->compat->session_info = session_info;
|
||||
DLIST_ADD(smb2req->sconn->users, session->compat);
|
||||
smb2req->sconn->num_users++;
|
||||
|
||||
if (security_session_user_level(session_info, NULL) >= SECURITY_USER) {
|
||||
@ -614,8 +607,6 @@ static NTSTATUS smbd_smb2_reauth_generic_return(struct smbXsrv_session *session,
|
||||
}
|
||||
talloc_keep_secret(session_info->session_key.data);
|
||||
|
||||
session->compat->session_info = session_info;
|
||||
|
||||
session->homes_snum =
|
||||
register_homes_share(session_info->unix_info->unix_name);
|
||||
|
||||
|
@ -1685,7 +1685,6 @@ NTSTATUS smbXsrv_session_logoff(struct smbXsrv_session *session)
|
||||
}
|
||||
|
||||
invalidate_vuid(sconn, session->global->session_wire_id);
|
||||
session->compat = NULL;
|
||||
|
||||
global_rec = session->global->db_rec;
|
||||
session->global->db_rec = NULL;
|
||||
|
Reference in New Issue
Block a user