[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Mon Jan 13 21:10:09 UTC 2020
The branch, master has been updated
via a18ffe26b3b smbd: RIP user_struct
via 5f85090d78c smbd: use smbXsrv_session_info_lookup() in become_user_without_service()
via cdab99ba1e7 smbd: remove using vuser from smbd_smb2_tree_connect()
via 1d797a839d4 smbd: don't use vuser in make_connection()
via 758c42ec5dd smbd: remove unused vuser arg from make_connection_smb2()
via 893aba4d65b smbd: remove unused vuser arg from make_connection_smb1()
via 9ef30c75b06 smbd: use req->session instead of vuser->session in make_connection_smb1()
via 8be0ca8e19b smbd: remove use of user_struct from reply_ulogoffX()
via 4b89100dc8d smbd: use smbXsrv_session_local_traverse() in id_in_use()
via 18b43aeb574 smbd: add smbXsrv_session_local_traverse()
via d2b5f85d221 smbd: remove enum server_allocated_state magic from get_valid_user_struct()
via c3d22018679 smbd: use get_valid_smbXsrv_session() in invalidate_vuid()
via dd9735b1da7 smbd: add get_valid_smbXsrv_session()
via a22b503819c smbd: use session->global->auth_session_info in switch_message()
via 54d626cc77e smbd: remove dependency on session->compat in smbXsrv_session_logoff()
via 25524c8e78b smbd: use smbXsrv_session_info_lookup() in api_reply()
via c3f890fb1e9 smbd: use smbXsrv_session_info_lookup() in api_WWkstaUserLogon()
via 46f51912aea smbd: share level security is long gone...
via 57d4689273f smbd: use smbXsrv_session_info_lookup() in change_to_user_and_service()
via e80aca04278 smbd: introduce smbXsrv_session_info_lookup()
via 96fd0ddd02e smbd: remove vuser arg from make_connection_snum()
via c1d0a70d19e smbd: use session->global->auth_session_info in make_connection_snum()
via 61fa0f99768 smbd: remove vuid from struct user_struct
via bcadd7d798e smbd: use session->global->session_wire_id instead of session->compat->vuid
via 5992f8fa93a smbd: pass smbXsrv_session to make_connection_snum()
via 8aae1ef5c0b smbd: move homes_snum from struct user_struct to struct smbXsrv_session
via aa27bceff19 smbd: add session to struct smb_request
via 15ee379ef11 s3: lib: dbwrap. Cleanup. Add a couple of missing 'return NULL' statements on talloc fail.
via 36ea1e188d5 s3: lib: dbwrap_ctdb: Ensure value_valid is set true if we find the record in the marshall buffer.
from c6d880a1150 s3-rpcserver: fix security level check for DsRGetForestTrustInformation
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit a18ffe26b3be13e45622172c4ade258cfc8fa783
Author: Ralph Boehme <slow at samba.org>
Date: Mon Jan 6 10:14:11 2020 +0100
smbd: RIP user_struct
At last, the nail in the coffin. :)
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Mon Jan 13 21:09:01 UTC 2020 on sn-devel-184
commit 5f85090d78c11c9c4ef58954b947a8bc71481e18
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:24:47 2020 +0100
smbd: use smbXsrv_session_info_lookup() in become_user_without_service()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit cdab99ba1e7ef48faeacf7ec45651ce5b48dc5d4
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:21:06 2020 +0100
smbd: remove using vuser from smbd_smb2_tree_connect()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1d797a839d4f96da649ff13bf8c6c7ea4b52ae44
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:16:38 2020 +0100
smbd: don't use vuser in make_connection()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 758c42ec5dd3dd8bba7b4f74741dc9b02cfb0d73
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:09:26 2020 +0100
smbd: remove unused vuser arg from make_connection_smb2()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 893aba4d65b6f2bdcd49ba3618f882fad0d5df49
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:07:23 2020 +0100
smbd: remove unused vuser arg from make_connection_smb1()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 9ef30c75b065876fee05103a4ad1b0d70d2d86c6
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 17:06:23 2020 +0100
smbd: use req->session instead of vuser->session in make_connection_smb1()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8be0ca8e19b861d13038769289325537c101072b
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 16:26:03 2020 +0100
smbd: remove use of user_struct from reply_ulogoffX()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4b89100dc8d7620657fa1e6335d47df97188c102
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 14:47:51 2020 +0100
smbd: use smbXsrv_session_local_traverse() in id_in_use()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 18b43aeb5747f0982e4296960f23986a5f536960
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 11:42:05 2020 +0100
smbd: add smbXsrv_session_local_traverse()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d2b5f85d221626ce505143c7c129c41603dcb24a
Author: Ralph Boehme <slow at samba.org>
Date: Mon Jan 6 10:12:32 2020 +0100
smbd: remove enum server_allocated_state magic from get_valid_user_struct()
This has been obsoleted a long time ago by
a129e271b5385853fb39a8e54b56b508b00a3e41.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c3d22018679c6aa83c4a5ae3e480532a3f5eccca
Author: Ralph Boehme <slow at samba.org>
Date: Mon Jan 6 08:20:14 2020 +0100
smbd: use get_valid_smbXsrv_session() in invalidate_vuid()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit dd9735b1da73b6c27feda32230e3fc843746fd2b
Author: Ralph Boehme <slow at samba.org>
Date: Mon Jan 6 08:19:18 2020 +0100
smbd: add get_valid_smbXsrv_session()
In memory of get_valid_user_struct() and functionally equivalent it only returns
the session if session setup was successfully completed and
session->global->auth_session_info is valid.
This function is similar to smbXsrv_session_local_lookup() and it's wrappers,
but it doesn't implement the state checks of those. get_valid_smbXsrv_session()
is NOT meant to be called to validate the session wire-id of incoming SMB
requests, it MUST only be used in later internal processing where the session
wire-id has already been validated.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit a22b503819ce19f8857484bb6c2ee21ce6b75a7f
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jan 2 08:07:31 2020 +0100
smbd: use session->global->auth_session_info in switch_message()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 54d626cc77e33c47912489d234df667d3d394f75
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 18:38:59 2020 +0100
smbd: remove dependency on session->compat in smbXsrv_session_logoff()
This is not needed anymore because a previous commit changes this to use
session->global->session_wire_id insteaf of session->compat->vuid, so we're not
depending on session->compat anymore.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 25524c8e78b0a927bcea5851d7282af0f0a0654e
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 15:20:05 2020 +0100
smbd: use smbXsrv_session_info_lookup() in api_reply()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c3f890fb1e982603c7f24033fc1e5d73535fbbb8
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 12:15:29 2020 +0100
smbd: use smbXsrv_session_info_lookup() in api_WWkstaUserLogon()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 46f51912aea157433537af27097a0127c7626085
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 09:47:38 2020 +0100
smbd: share level security is long gone...
vuid will always be valid as will be vuser.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 57d4689273f01bb458c33ff6577e1ac3f179ece9
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 01:06:45 2020 +0100
smbd: use smbXsrv_session_info_lookup() in change_to_user_and_service()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit e80aca04278e6bfd35744ca852549669cee8a8e2
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jan 1 01:06:24 2020 +0100
smbd: introduce smbXsrv_session_info_lookup()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 96fd0ddd02eae05024102b5ed8dc7fb158ed1785
Author: Ralph Boehme <slow at samba.org>
Date: Mon Dec 30 10:28:25 2019 +0100
smbd: remove vuser arg from make_connection_snum()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c1d0a70d19ec03f8a1fd770e53db7a921af1282d
Author: Ralph Boehme <slow at samba.org>
Date: Mon Dec 30 10:26:26 2019 +0100
smbd: use session->global->auth_session_info in make_connection_snum()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 61fa0f99768bf3519cafd2c49d0b774bc4c22841
Author: Ralph Boehme <slow at samba.org>
Date: Sun Dec 29 14:33:00 2019 +0100
smbd: remove vuid from struct user_struct
The previous commit removed all users of struct user_struct.vuid.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit bcadd7d798e0cc9bb58835ecac1799dfea8a4cb8
Author: Ralph Boehme <slow at samba.org>
Date: Sun Dec 29 14:33:00 2019 +0100
smbd: use session->global->session_wire_id instead of session->compat->vuid
session->compat->vuid is set to session->global->session_wire_id after a
successful session setup, so both variables will always carry the same value. Cf
the next commit which removes vuid from user_struct.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 5992f8fa93adfcd6fc9e5c0632fc36f02ce271ca
Author: Ralph Boehme <slow at samba.org>
Date: Sun Dec 29 14:34:42 2019 +0100
smbd: pass smbXsrv_session to make_connection_snum()
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8aae1ef5c0b9c50f892e01316fdac5dc6504ecbb
Author: Ralph Boehme <slow at samba.org>
Date: Sun Dec 29 08:31:45 2019 +0100
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 <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit aa27bceff194bf1d6665bcb66dd3ba750a59b598
Author: Ralph Boehme <slow at samba.org>
Date: Sun Dec 29 08:30:22 2019 +0100
smbd: add session to struct smb_request
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 15ee379ef11d86670aeea7fa4b8bf740dd259593
Author: Jeremy Allison <jra at samba.org>
Date: Fri Jan 10 15:55:29 2020 -0800
s3: lib: dbwrap. Cleanup. Add a couple of missing 'return NULL' statements on talloc fail.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 36ea1e188d5ea8d40c47ffc466a494c1160e471c
Author: Jeremy Allison <jra at samba.org>
Date: Fri Jan 10 15:52:31 2020 -0800
s3: lib: dbwrap_ctdb: Ensure value_valid is set true if we find the record in the marshall buffer.
Found by "Christopher O Cowan - Christopher.O.Cowan at ibm.com" <Christopher.O.Cowan at ibm.com>
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/include/vfs.h | 7 ++
source3/lib/dbwrap/dbwrap_ctdb.c | 3 +
source3/librpc/idl/smbXsrv.idl | 2 +-
source3/smbd/files.c | 6 +-
source3/smbd/globals.h | 24 +++--
source3/smbd/lanman.c | 37 +++++---
source3/smbd/password.c | 67 +-------------
source3/smbd/process.c | 145 +++++++++++++++++------------
source3/smbd/proto.h | 3 -
source3/smbd/reply.c | 14 ++-
source3/smbd/service.c | 40 ++++----
source3/smbd/sesssetup.c | 46 ++--------
source3/smbd/smb2_glue.c | 3 +-
source3/smbd/smb2_server.c | 5 +-
source3/smbd/smb2_sesssetup.c | 27 ++----
source3/smbd/smb2_setinfo.c | 5 +-
source3/smbd/smb2_tcon.c | 19 ++--
source3/smbd/smbXsrv_session.c | 192 ++++++++++++++++++++++++++++++++++++---
source3/smbd/smbXsrv_tcon.c | 8 +-
source3/smbd/uid.c | 23 +++--
20 files changed, 391 insertions(+), 285 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index a836903a832..656fad8b5ee 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -580,6 +580,13 @@ struct smb_request {
connection_struct *conn;
struct smbd_server_connection *sconn;
struct smbXsrv_connection *xconn;
+
+ /*
+ * Pointer to session, can be NULL,
+ * eg during negprot and session setup.
+ */
+ struct smbXsrv_session *session;
+
struct smb_perfcount_data pcd;
/*
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index ef667261359..3cbed6322b3 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -534,6 +534,7 @@ static struct db_record *db_ctdb_fetch_locked_transaction(struct db_ctdb_ctx *ct
}
if (pull_newest_from_marshall_buffer(ctx->transaction->m_write, key,
NULL, result, &result->value)) {
+ result->value_valid = true;
return result;
}
@@ -553,6 +554,7 @@ static struct db_record *db_ctdb_fetch_locked_transaction(struct db_ctdb_ctx *ct
result->value.dsize))) {
DEBUG(0, ("talloc failed\n"));
TALLOC_FREE(result);
+ return NULL;
}
result->value_valid = true;
@@ -1245,6 +1247,7 @@ again:
if (result->value.dptr == NULL) {
DBG_ERR("talloc failed\n");
TALLOC_FREE(result);
+ return NULL;
}
}
result->value_valid = true;
diff --git a/source3/librpc/idl/smbXsrv.idl b/source3/librpc/idl/smbXsrv.idl
index b8f3dc679ea..c6ce9c48789 100644
--- a/source3/librpc/idl/smbXsrv.idl
+++ b/source3/librpc/idl/smbXsrv.idl
@@ -290,8 +290,8 @@ 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;
} smbXsrv_session;
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 97947753170..99b2f343685 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -661,11 +661,7 @@ struct files_struct *file_fsp_get(struct smbd_smb2_request *smb2req,
return NULL;
}
- if (smb2req->session->compat == NULL) {
- return NULL;
- }
-
- if (smb2req->session->compat->vuid != fsp->vuid) {
+ if (smb2req->session->global->session_wire_id != fsp->vuid) {
return NULL;
}
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index ee4116c76ba..7b26d04ed0f 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -573,6 +573,9 @@ NTSTATUS smb1srv_session_table_init(struct smbXsrv_connection *conn);
NTSTATUS smb1srv_session_lookup(struct smbXsrv_connection *conn,
uint16_t vuid, NTTIME now,
struct smbXsrv_session **session);
+NTSTATUS smbXsrv_session_info_lookup(struct smbXsrv_client *client,
+ uint64_t session_wire_id,
+ struct auth_session_info **si);
NTSTATUS smb2srv_session_table_init(struct smbXsrv_connection *conn);
NTSTATUS smb2srv_session_lookup_conn(struct smbXsrv_connection *conn,
uint64_t session_id, NTTIME now,
@@ -580,6 +583,14 @@ NTSTATUS smb2srv_session_lookup_conn(struct smbXsrv_connection *conn,
NTSTATUS smb2srv_session_lookup_client(struct smbXsrv_client *client,
uint64_t session_id, NTTIME now,
struct smbXsrv_session **session);
+NTSTATUS get_valid_smbXsrv_session(struct smbXsrv_client *client,
+ uint64_t session_wire_id,
+ struct smbXsrv_session **session);
+NTSTATUS smbXsrv_session_local_traverse(
+ struct smbXsrv_client *client,
+ int (*caller_cb)(struct smbXsrv_session *session,
+ void *caller_data),
+ void *caller_data);
struct smbXsrv_session_global0;
NTSTATUS smbXsrv_session_global_traverse(
int (*fn)(struct smbXsrv_session_global0 *, void *),
@@ -829,22 +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;
- uint64_t vuid; /* Tag for this entry. */
-
- int homes_snum;
-
- struct auth_session_info *session_info;
-
- struct smbXsrv_session *session;
-};
-
struct pthreadpool_tevent;
struct smbd_server_connection {
@@ -858,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;
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index 9babb65f33f..abbec164217 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -4415,19 +4415,23 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
int uLevel;
struct pack_desc desc;
char* name;
- /* With share level security vuid will always be zero.
- Don't depend on vuser being non-null !!. JRA */
- struct user_struct *vuser = get_valid_user_struct(sconn, vuid);
+ struct auth_session_info *si = NULL;
+ NTSTATUS status;
+
+ status = smbXsrv_session_info_lookup(conn->sconn->client,
+ vuid,
+ &si);
+ if (!NT_STATUS_IS_OK(status)) {
+ return false;
+ }
if (!str1 || !str2 || !p) {
return False;
}
- if(vuser != NULL) {
- DEBUG(3,(" Username of UID %d is %s\n",
- (int)vuser->session_info->unix_token->uid,
- vuser->session_info->unix_info->unix_name));
- }
+ DBG_INFO("Username of UID %ju is %s\n",
+ (uintmax_t)si->unix_token->uid,
+ si->unix_info->unix_name);
uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
name = get_safe_str_ptr(param,tpscnt,p,2);
@@ -4487,9 +4491,7 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn,
}
PACKS(&desc,"z",lp_workgroup());/* domain */
- PACKS(&desc,"z", vuser ?
- vuser->session_info->info->logon_script
- : ""); /* script path */
+ PACKS(&desc,"z", si->info->logon_script); /* script path */
PACKI(&desc,"D",0x00000000); /* reserved */
}
@@ -5790,9 +5792,18 @@ void api_reply(connection_struct *conn, uint64_t vuid,
/* Check whether this api call can be done anonymously */
if (api_commands[i].auth_user && lp_restrict_anonymous()) {
- struct user_struct *user = get_valid_user_struct(req->sconn, vuid);
+ struct auth_session_info *si = NULL;
+ NTSTATUS status;
+
+ status = smbXsrv_session_info_lookup(conn->sconn->client,
+ vuid,
+ &si);
+ if (!NT_STATUS_IS_OK(status)) {
+ reply_nterror(req, NT_STATUS_ACCESS_DENIED);
+ return;
+ }
- if (!user || security_session_user_level(user->session_info, NULL) < SECURITY_USER) {
+ if (security_session_user_level(si, NULL) < SECURITY_USER) {
reply_nterror(req, NT_STATUS_ACCESS_DENIED);
return;
}
diff --git a/source3/smbd/password.c b/source3/smbd/password.c
index 284a4aba778..9709a51a109 100644
--- a/source3/smbd/password.c
+++ b/source3/smbd/password.c
@@ -26,85 +26,28 @@
#include "auth.h"
#include "../libcli/security/security.h"
-enum server_allocated_state { SERVER_ALLOCATED_REQUIRED_YES,
- SERVER_ALLOCATED_REQUIRED_NO,
- SERVER_ALLOCATED_REQUIRED_ANY};
-
-static struct user_struct *get_valid_user_struct_internal(
- struct smbd_server_connection *sconn,
- uint64_t vuid,
- enum server_allocated_state server_allocated)
-{
- 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->vuid) {
- switch (server_allocated) {
- case SERVER_ALLOCATED_REQUIRED_YES:
- if (usp->session_info == NULL) {
- continue;
- }
- break;
- case SERVER_ALLOCATED_REQUIRED_NO:
- if (usp->session_info != NULL) {
- continue;
- }
- case SERVER_ALLOCATED_REQUIRED_ANY:
- break;
- }
- if (count > 10) {
- DLIST_PROMOTE(sconn->users, usp);
- }
- return usp;
- }
- }
-
- return NULL;
-}
-
-/****************************************************************************
- 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)
-{
- return get_valid_user_struct_internal(sconn, vuid,
- SERVER_ALLOCATED_REQUIRED_YES);
-}
-
/****************************************************************************
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_internal(sconn, vuid,
- SERVER_ALLOCATED_REQUIRED_ANY);
- if (vuser == NULL) {
+ status = get_valid_smbXsrv_session(sconn->client, vuid, &session);
+ if (!NT_STATUS_IS_OK(status)) {
return;
}
- session_yield(vuser->session);
+ 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)
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index e1211ad16a4..f6eeafc88cf 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -1587,9 +1587,10 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
}
}
- if (session != NULL && !(flags & AS_USER)) {
- struct user_struct *vuser = session->compat;
-
+ if (session != NULL &&
+ session->global->auth_session_info != NULL &&
+ !(flags & AS_USER))
+ {
/*
* change_to_user() implies set_current_user_info()
* and chdir_connect_service().
@@ -1597,12 +1598,10 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
* So we only call set_current_user_info if
* we don't have AS_USER specified.
*/
- if (vuser) {
- set_current_user_info(
- vuser->session_info->unix_info->sanitized_username,
- vuser->session_info->unix_info->unix_name,
- vuser->session_info->info->domain_name);
- }
+ set_current_user_info(
+ session->global->auth_session_info->unix_info->sanitized_username,
+ session->global->auth_session_info->unix_info->unix_name,
+ session->global->auth_session_info->info->domain_name);
}
/* Does this call need to be run as the connected user? */
@@ -1701,6 +1700,8 @@ static connection_struct *switch_message(uint8_t type, struct smb_request *req)
bool update_session_global = false;
bool update_tcon_global = false;
+ req->session = session;
+
smb1srv_update_crypto_flags(session, req, type,
&update_session_global,
&update_tcon_global);
@@ -3471,80 +3472,106 @@ fail:
return false;
}
-static bool uid_in_use(const struct user_struct *user, uid_t uid)
+static bool uid_in_use(struct auth_session_info *session_info,
+ uid_t uid)
{
- while (user) {
- if (user->session_info &&
- (user->session_info->unix_token->uid == uid)) {
- return true;
- }
- user = user->next;
+ if (session_info->unix_token->uid == uid) {
+ return true;
}
return false;
}
-static bool gid_in_use(const struct user_struct *user, gid_t gid)
+static bool gid_in_use(struct auth_session_info *session_info,
+ gid_t gid)
{
- while (user) {
- if (user->session_info != NULL) {
- int i;
- struct security_unix_token *utok;
-
- utok = user->session_info->unix_token;
- if (utok->gid == gid) {
- return true;
- }
- for(i=0; i<utok->ngroups; i++) {
- if (utok->groups[i] == gid) {
- return true;
- }
- }
+ int i;
+ struct security_unix_token *utok = NULL;
+
+ utok = session_info->unix_token;
+ if (utok->gid == gid) {
+ return true;
+ }
+
+ for(i = 0; i < utok->ngroups; i++) {
+ if (utok->groups[i] == gid) {
+ return true;
}
- user = user->next;
}
return false;
}
-static bool sid_in_use(const struct user_struct *user,
+static bool sid_in_use(struct auth_session_info *session_info,
const struct dom_sid *psid)
{
- while (user) {
- struct security_token *tok;
+ struct security_token *tok = NULL;
- if (user->session_info == NULL) {
- continue;
- }
- tok = user->session_info->security_token;
- if (tok == NULL) {
- /*
- * Not sure session_info->security_token can
- * ever be NULL. This check might be not
- * necessary.
- */
- continue;
- }
- if (security_token_has_sid(tok, psid)) {
- return true;
- }
- user = user->next;
+ tok = session_info->security_token;
+ if (tok == NULL) {
+ /*
+ * Not sure session_info->security_token can
+ * ever be NULL. This check might be not
+ * necessary.
+ */
+ return false;
+ }
+ if (security_token_has_sid(tok, psid)) {
+ return true;
}
return false;
}
-static bool id_in_use(const struct user_struct *user,
- const struct id_cache_ref *id)
+struct id_in_use_state {
+ const struct id_cache_ref *id;
+ bool match;
+};
+
+static int id_in_use_cb(struct smbXsrv_session *session,
+ void *private_data)
{
- switch(id->type) {
+ struct id_in_use_state *state = (struct id_in_use_state *)
+ private_data;
+ struct auth_session_info *session_info =
+ session->global->auth_session_info;
+
+ switch(state->id->type) {
case UID:
- return uid_in_use(user, id->id.uid);
+ state->match = uid_in_use(session_info, state->id->id.uid);
+ break;
case GID:
- return gid_in_use(user, id->id.gid);
+ state->match = gid_in_use(session_info, state->id->id.gid);
+ break;
case SID:
- return sid_in_use(user, &id->id.sid);
+ state->match = sid_in_use(session_info, &state->id->id.sid);
+ break;
default:
+ state->match = false;
break;
}
- return false;
+ if (state->match) {
+ return -1;
+ }
+ return 0;
+}
+
+static bool id_in_use(struct smbd_server_connection *sconn,
+ const struct id_cache_ref *id)
+{
+ struct id_in_use_state state;
+ NTSTATUS status;
+
+ state = (struct id_in_use_state) {
+ .id = id,
+ .match = false,
+ };
+
+ status = smbXsrv_session_local_traverse(sconn->client,
+ id_in_use_cb,
+ &state);
+ if (!NT_STATUS_IS_OK(status)) {
+ return false;
+ }
+
+ return state.match;
}
static void smbd_id_cache_kill(struct messaging_context *msg_ctx,
--
Samba Shared Repository
More information about the samba-cvs
mailing list