[SCM] Samba Shared Repository - branch master updated
Andrew Tridgell
tridge at samba.org
Wed Jul 14 00:23:03 MDT 2010
The branch, master has been updated
via 0d95cee... s3:auth Change auth_ntlmssp_server_info API to return NTSTATUS
via 1debe30... s3:smbd Give the kerberos session key a parent
via 39d1a52... s3:smbd Fix segfault if register_existing_vuid() fails
from bfdd85d... s3-selftest: enable RPC-BIND against s3.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 0d95cee58f80e46636fa4b826d248c9ce9983c9b
Author: Andrew Bartlett <abartlet at samba.org>
Date: Mon Jul 12 14:26:34 2010 +1000
s3:auth Change auth_ntlmssp_server_info API to return NTSTATUS
This fixes a bug where register_existing_vuid() could be called with a
NULL server_info if the alloction failed.
Andrew Bartlett
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 1debe30689e75023fab44028ef6942a692e37e95
Author: Andrew Bartlett <abartlet at samba.org>
Date: Mon Jul 12 14:25:28 2010 +1000
s3:smbd Give the kerberos session key a parent
Nothing will free this, so this prevents a memory leak.
Andrew Bartlett
Signed-off-by: Jelmer Vernooij <jelmer at samba.org>
Signed-off-by: Andrew Tridgell <tridge at samba.org>
commit 39d1a525d1bb658bd0a666c3f630a669b5399ef1
Author: Andrew Bartlett <abartlet at samba.org>
Date: Mon Jul 12 14:21:34 2010 +1000
s3:smbd Fix segfault if register_existing_vuid() fails
The register_existing_vuid() call will handle both the ntlmssp_end and
vuid invalidation internally, so we don't want to do it again.
Andrew Bartlett
Signed-off-by: Jelmer Vernooij <jelmer at samba.org>
Signed-off-by: Andrew Tridgell <tridge at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/auth/auth_ntlmssp.c | 11 +++++++----
source3/include/proto.h | 5 +++--
source3/rpc_server/srv_pipe.c | 7 ++++---
source3/smbd/sesssetup.c | 20 +++++++++++++++-----
source3/smbd/smb2_sesssetup.c | 7 ++++---
5 files changed, 33 insertions(+), 17 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c
index df4666a..ba7efbf 100644
--- a/source3/auth/auth_ntlmssp.c
+++ b/source3/auth/auth_ntlmssp.c
@@ -84,8 +84,9 @@ void auth_ntlmssp_want_seal(struct auth_ntlmssp_state *auth_ntlmssp_state)
}
-struct auth_serversupplied_info *auth_ntlmssp_server_info(TALLOC_CTX *mem_ctx,
- struct auth_ntlmssp_state *auth_ntlmssp_state)
+NTSTATUS auth_ntlmssp_server_info(TALLOC_CTX *mem_ctx,
+ struct auth_ntlmssp_state *auth_ntlmssp_state,
+ struct auth_serversupplied_info **_server_info)
{
struct auth_serversupplied_info *server_info = auth_ntlmssp_state->server_info;
data_blob_free(&server_info->user_session_key);
@@ -95,10 +96,12 @@ struct auth_serversupplied_info *auth_ntlmssp_server_info(TALLOC_CTX *mem_ctx,
auth_ntlmssp_state->ntlmssp_state->session_key.data,
auth_ntlmssp_state->ntlmssp_state->session_key.length);
if (auth_ntlmssp_state->ntlmssp_state->session_key.length && !server_info->user_session_key.data) {
- return NULL;
+ *_server_info = NULL;
+ return NT_STATUS_NO_MEMORY;
}
auth_ntlmssp_state->server_info = NULL;
- return talloc_steal(mem_ctx, server_info);
+ *_server_info = talloc_steal(mem_ctx, server_info);
+ return NT_STATUS_OK;
}
struct ntlmssp_state *auth_ntlmssp_get_ntlmssp_state(struct auth_ntlmssp_state *auth_ntlmssp_state)
diff --git a/source3/include/proto.h b/source3/include/proto.h
index d7b70cb..cfa68da 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -54,8 +54,9 @@ NTSTATUS auth_netlogond_init(void);
/* The following definitions come from auth/auth_ntlmssp.c */
-struct auth_serversupplied_info *auth_ntlmssp_server_info(TALLOC_CTX *mem_ctx,
- struct auth_ntlmssp_state *auth_ntlmssp_state);
+NTSTATUS auth_ntlmssp_server_info(TALLOC_CTX *mem_ctx,
+ struct auth_ntlmssp_state *auth_ntlmssp_state,
+ struct auth_serversupplied_info **_server_info);
struct ntlmssp_state *auth_ntlmssp_get_ntlmssp_state(struct auth_ntlmssp_state *auth_ntlmssp_state);
const char *auth_ntlmssp_get_username(struct auth_ntlmssp_state *auth_ntlmssp_state);
const char *auth_ntlmssp_get_domain(struct auth_ntlmssp_state *auth_ntlmssp_state);
diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c
index 34587f8..85c212a 100644
--- a/source3/rpc_server/srv_pipe.c
+++ b/source3/rpc_server/srv_pipe.c
@@ -736,9 +736,10 @@ static bool pipe_ntlmssp_verify_final(pipes_struct *p, DATA_BLOB *p_resp_blob)
TALLOC_FREE(p->server_info);
- p->server_info = auth_ntlmssp_server_info(p, a);
- if (p->server_info == NULL) {
- DEBUG(0, ("auth_ntlmssp_server_info failed to obtain the server info for authenticated user\n"));
+ status = auth_ntlmssp_server_info(p, a, &p->server_info);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("auth_ntlmssp_server_info failed to obtain the server info for authenticated user: %s\n",
+ nt_errstr(status)));
return false;
}
diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c
index b296a1f..80a5239 100644
--- a/source3/smbd/sesssetup.c
+++ b/source3/smbd/sesssetup.c
@@ -561,6 +561,8 @@ static void reply_spnego_kerberos(struct smb_request *req,
data_blob_free(&server_info->user_session_key);
server_info->user_session_key = session_key;
+ talloc_steal(server_info, session_key.data);
+
session_key = data_blob_null;
/* register_existing_vuid keeps the server info */
@@ -629,12 +631,13 @@ static void reply_spnego_ntlmssp(struct smb_request *req,
const char *OID,
bool wrap)
{
+ bool do_invalidate = true;
DATA_BLOB response;
struct auth_serversupplied_info *server_info = NULL;
struct smbd_server_connection *sconn = req->sconn;
if (NT_STATUS_IS_OK(nt_status)) {
- server_info = auth_ntlmssp_server_info(talloc_tos(), (*auth_ntlmssp_state));
+ nt_status = auth_ntlmssp_server_info(talloc_tos(), (*auth_ntlmssp_state), &server_info);
} else {
/* Note that this server_info won't have a session
* key. But for map to guest, that's exactly the right
@@ -663,6 +666,11 @@ static void reply_spnego_ntlmssp(struct smb_request *req,
server_info, nullblob,
auth_ntlmssp_get_username(*auth_ntlmssp_state)) !=
vuid) {
+ /* The problem is, *auth_ntlmssp_state points
+ * into the vuser this will have
+ * talloc_free()'ed in
+ * register_existing_vuid() */
+ do_invalidate = false;
nt_status = NT_STATUS_LOGON_FAILURE;
goto out;
}
@@ -696,10 +704,12 @@ static void reply_spnego_ntlmssp(struct smb_request *req,
if (!NT_STATUS_EQUAL(nt_status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
/* NB. This is *NOT* an error case. JRA */
- auth_ntlmssp_end(auth_ntlmssp_state);
- if (!NT_STATUS_IS_OK(nt_status)) {
- /* Kill the intermediate vuid */
- invalidate_vuid(sconn, vuid);
+ if (do_invalidate) {
+ auth_ntlmssp_end(auth_ntlmssp_state);
+ if (!NT_STATUS_IS_OK(nt_status)) {
+ /* Kill the intermediate vuid */
+ invalidate_vuid(sconn, vuid);
+ }
}
}
}
diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 56aa2b8..6586a45 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -615,11 +615,12 @@ static NTSTATUS smbd_smb2_common_ntlmssp_auth_return(struct smbd_smb2_session *s
uint64_t *out_session_id)
{
fstring tmp;
- session->server_info = auth_ntlmssp_server_info(session, session->auth_ntlmssp_state);
- if (!session->server_info) {
+ NTSTATUS status = auth_ntlmssp_server_info(session, session->auth_ntlmssp_state,
+ &session->server_info);
+ if (!NT_STATUS_IS_OK(status)) {
auth_ntlmssp_end(&session->auth_ntlmssp_state);
TALLOC_FREE(session);
- return NT_STATUS_NO_MEMORY;
+ return status;
}
if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) ||
--
Samba Shared Repository
More information about the samba-cvs
mailing list