[SCM] Samba Shared Repository - branch master updated

Noel Power npower at samba.org
Tue Oct 24 13:48:01 UTC 2023


The branch, master has been updated
       via  6830b796ac8 s3:/winbindd: remove parse_domain_user_fstr
       via  5640d7ab6c9 s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
       via  b4bdd341a71 s3/winbindd: replace use of parse_domain_user_fstr with parse_domain_user
       via  89fb5eee53c s3/winbindd: replace parse_domain_user_fn with parse_domain_user
       via  b5427ef86bb s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
       via  9d5652ec021 s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
       via  f734b1b2fca s3/winbindd: use parse_domain_user_fstr instead of parse_domain_user
       via  d4341d48842 s3/winbindd: Add new parse_domain_user function
       via  87a919082b9 s3/winbindd: rename parse_domain_user to parse_domain_user_fstr
       via  c6fe21e138d s3/winbindd: remove canonicalize_username_fstr
       via  d1beafe7ccf s3/winbindd: in winbindd_pam_chauthtok_send use canonicalize_username
       via  be6ed28f02f s3/winbindd: in winbindd_pam_auth_send use canonicalize_username
       via  85e8d33a33c s3/winbindd: in winbindd_pam_logoff_send use canonicalize_username
       via  aa3febfddc7 s3/winbindd: in winbindd_ccache_save use canonicalize_username
       via  2e06bf9feb3 s3/winbindd: Add new canonicalize_username function
       via  7e1f210b9af s3/winbindd: rename canonicalize_username to canonicalize_username_fstr
       via  9267d9b2683 s3/winbind: Ensure parse_domain_user() can't write beyond the end of domain[]
      from  3f4f80edba2 smb2_server: monitor connections with TEVENT_FD_ERROR

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6830b796ac8937c8171f8f834c17f0cb7acf68b5
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 23 15:12:39 2023 +0100

    s3:/winbindd: remove parse_domain_user_fstr
    
    Last caller of parse_domain_user_fstr has been removed so
    we can safely remove the function
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Noel Power <npower at samba.org>
    Autobuild-Date(master): Tue Oct 24 13:47:16 UTC 2023 on atb-devel-224

commit 5640d7ab6c9ba3928a7ee79503977ffcb263c3da
Author: Noel Power <noel.power at suse.com>
Date:   Mon Oct 23 15:09:25 2023 +0100

    s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
    
    In canonicalize_username replace use of parse_domain_user_fstr
    with parse_domain_user
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit b4bdd341a71e26008d1b69663bb625f491fd08c9
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 12:36:35 2023 +0100

    s3/winbindd: replace use of parse_domain_user_fstr with parse_domain_user
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 89fb5eee53c969f8375238e52dbe04f3d9568fe5
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 12:22:10 2023 +0100

    s3/winbindd: replace parse_domain_user_fn with parse_domain_user
    
    In winbindd_getgrnam_send use parse_domain_user instead of
    parse_domain_user_fstr
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit b5427ef86bb1912ef5509141342e1a5c5ab074d7
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 12:10:37 2023 +0100

    s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
    
    In winbindd_ccache_ntlm_auth replace use of parse_domain_user_fstr
    with parse_domain_user
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 9d5652ec021f7bcdeac95a31810ddcf8eaf6c9f4
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 12:09:17 2023 +0100

    s3/winbindd: use parse_domain_user instead of parse_domain_user_fstr
    
    in winbindd_getpwnam_send replace parse_domain_user_fstr with
    parse_domain_user
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit f734b1b2fcad1d77a1aab83f999f86c8eb3f15f6
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 11:53:10 2023 +0100

    s3/winbindd: use parse_domain_user_fstr instead of parse_domain_user
    
    in winbindd_getgroups_send replace parse_domain_user_fstr
    with parse_domain_user
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit d4341d4884244b6dbc7cce8f0ef150964fcacc86
Author: Noel Power <noel.power at suse.com>
Date:   Fri Oct 20 11:46:56 2023 +0100

    s3/winbindd: Add new parse_domain_user function
    
    Adds a new parse_domain_user function which doesn't use fstrings
    but instead uses talloc allocated out strings (created from passed in
    ctx)
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 87a919082b9981b6dfac1b99f8982c01a19931d5
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 21:35:06 2023 +0100

    s3/winbindd: rename parse_domain_user to parse_domain_user_fstr
    
    prepare to port parse_domain_user function to not use fstrings.
    rename function parse_domain_user (and all callers) to use
    parse_domain_user_fstr
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit c6fe21e138db6615b99eb5e708e54f7082edb5f7
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 12:41:39 2023 +0100

    s3/winbindd: remove canonicalize_username_fstr
    
    not longer any callers to canonicalize_username_fstr so it
    can be removed
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit d1beafe7ccf583492ead32742296093c5126ad30
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 21:29:34 2023 +0100

    s3/winbindd: in winbindd_pam_chauthtok_send use canonicalize_username
    
    replace use of canonicalize_username_fstr with canonicalize_username
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit be6ed28f02f1b62bbb4248e8cd9afcc54b04133a
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 12:24:01 2023 +0100

    s3/winbindd: in winbindd_pam_auth_send use canonicalize_username
    
    replace use of canonicalize_username_fstr with canonicalize_username
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 85e8d33a33c244c3c01833e4bf7397bd0c64c274
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 12:13:19 2023 +0100

    s3/winbindd: in winbindd_pam_logoff_send use canonicalize_username
    
    replace use of canonicalize_username_fstr with canonicalize_username
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit aa3febfddc7c070a1f4cc3c1d744af472d9d995e
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 12:06:10 2023 +0100

    s3/winbindd: in winbindd_ccache_save use canonicalize_username
    
    replace use of canonicalize_username_fstr with canonicalize_username
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 2e06bf9feb3d6f14fa981c9b79f6fb89311f781f
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 11:47:30 2023 +0100

    s3/winbindd: Add new canonicalize_username function
    
    Add a mew canonicalize_username replacement function for
    canonicalize_username_fstr which doesn't use fstrings but instead
    uses talloc allocated strings
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 7e1f210b9afbe76a3825cb606e7ef2be4044bcad
Author: Noel Power <noel.power at suse.com>
Date:   Sat Oct 21 11:17:46 2023 +0100

    s3/winbindd: rename canonicalize_username to canonicalize_username_fstr
    
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 9267d9b2683cb66c6b0252aabca13f8d0c95c4aa
Author: Noel Power <noel.power at suse.com>
Date:   Sun Oct 22 11:30:19 2023 +0100

    s3/winbind: Ensure parse_domain_user() can't write beyond the end of domain[]
    
    fail if we try to write beyond the fstring boundry
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15467
    Signed-off-by: Noel Power <noel.power at suse.com>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/winbindd/winbindd_ccache_access.c |  52 +++++++++----
 source3/winbindd/winbindd_getgrnam.c      |  19 +++--
 source3/winbindd/winbindd_getgroups.c     |  14 ++--
 source3/winbindd/winbindd_getpwnam.c      |  15 ++--
 source3/winbindd/winbindd_pam.c           | 112 +++++++++++++++++++--------
 source3/winbindd/winbindd_pam_auth.c      |  19 +++--
 source3/winbindd/winbindd_pam_chauthtok.c |  17 ++--
 source3/winbindd/winbindd_pam_logoff.c    |  20 +++--
 source3/winbindd/winbindd_proto.h         |  50 ++++++++++--
 source3/winbindd/winbindd_util.c          | 124 ++++++++++++++++++++++--------
 10 files changed, 318 insertions(+), 124 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/winbindd/winbindd_ccache_access.c b/source3/winbindd/winbindd_ccache_access.c
index f18a1d25f88..cc395ad3bda 100644
--- a/source3/winbindd/winbindd_ccache_access.c
+++ b/source3/winbindd/winbindd_ccache_access.c
@@ -26,6 +26,7 @@
 #include "winbindd.h"
 #include "auth/gensec/gensec.h"
 #include "auth_generic.h"
+#include "lib/util/string_wrappers.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
@@ -183,7 +184,10 @@ static bool check_client_uid(struct winbindd_cli_state *state, uid_t uid)
 bool winbindd_ccache_ntlm_auth(struct winbindd_cli_state *state)
 {
 	struct winbindd_domain *domain;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
+	char *auth_user = NULL;
 	NTSTATUS result = NT_STATUS_NOT_SUPPORTED;
 	struct WINBINDD_MEMORY_CREDS *entry;
 	DATA_BLOB initial, challenge, auth;
@@ -199,16 +203,21 @@ bool winbindd_ccache_ntlm_auth(struct winbindd_cli_state *state)
 
 	/* Parse domain and username */
 
-	ok = canonicalize_username(state->request->data.ccache_ntlm_auth.user,
-				   name_namespace,
-				   name_domain,
-				   name_user);
+	auth_user = state->request->data.ccache_ntlm_auth.user;
+	ok = canonicalize_username(state,
+				   &auth_user,
+				   &name_namespace,
+				   &name_domain,
+				   &name_user);
 	if (!ok) {
 		DEBUG(5,("winbindd_ccache_ntlm_auth: cannot parse domain and user from name [%s]\n",
 			state->request->data.ccache_ntlm_auth.user));
 		return false;
 	}
 
+	fstrcpy(state->request->data.ccache_ntlm_auth.user, auth_user);
+	TALLOC_FREE(auth_user);
+
 	domain = find_auth_domain(state->request->flags, name_domain);
 
 	if (domain == NULL) {
@@ -239,11 +248,15 @@ bool winbindd_ccache_ntlm_auth(struct winbindd_cli_state *state)
 		goto process_result;
 	}
 
+	TALLOC_FREE(name_namespace);
+	TALLOC_FREE(name_domain);
+	TALLOC_FREE(name_user);
 	/* Parse domain and username */
-	ok = parse_domain_user(state->request->data.ccache_ntlm_auth.user,
-			       name_namespace,
-			       name_domain,
-			       name_user);
+	ok = parse_domain_user(state,
+			       state->request->data.ccache_ntlm_auth.user,
+			       &name_namespace,
+			       &name_domain,
+			       &name_user);
 	if (!ok) {
 		DEBUG(10,("winbindd_dual_ccache_ntlm_auth: cannot parse "
 			"domain and user from name [%s]\n",
@@ -306,13 +319,19 @@ bool winbindd_ccache_ntlm_auth(struct winbindd_cli_state *state)
 	data_blob_free(&auth);
 
   process_result:
+	TALLOC_FREE(name_namespace);
+	TALLOC_FREE(name_domain);
+	TALLOC_FREE(name_user);
 	return NT_STATUS_IS_OK(result);
 }
 
 bool winbindd_ccache_save(struct winbindd_cli_state *state)
 {
 	struct winbindd_domain *domain;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
+	char *save_user = NULL;
 	NTSTATUS status;
 	bool ok;
 
@@ -328,10 +347,13 @@ bool winbindd_ccache_save(struct winbindd_cli_state *state)
 
 	/* Parse domain and username */
 
-	ok = canonicalize_username(state->request->data.ccache_save.user,
-				   name_namespace,
-				   name_domain,
-				   name_user);
+
+	save_user = state->request->data.ccache_save.user;
+	ok = canonicalize_username(state,
+				   &save_user,
+				   &name_namespace,
+				   &name_domain,
+				   &name_user);
 	if (!ok) {
 		DEBUG(5,("winbindd_ccache_save: cannot parse domain and user "
 			 "from name [%s]\n",
@@ -339,6 +361,8 @@ bool winbindd_ccache_save(struct winbindd_cli_state *state)
 		return false;
 	}
 
+	fstrcpy(state->request->data.ccache_save.user, save_user);
+
 	/*
 	 * The domain is checked here only for compatibility
 	 * reasons. We used to do the winbindd memory ccache for
diff --git a/source3/winbindd/winbindd_getgrnam.c b/source3/winbindd/winbindd_getgrnam.c
index 89a1ba83218..6b277c2dc97 100644
--- a/source3/winbindd/winbindd_getgrnam.c
+++ b/source3/winbindd/winbindd_getgrnam.c
@@ -24,7 +24,9 @@
 
 struct winbindd_getgrnam_state {
 	struct tevent_context *ev;
-	fstring name_namespace, name_domain, name_group;
+	char *name_namespace;
+	char *name_domain;
+	char *name_group;
 	struct dom_sid sid;
 	const char *domname;
 	const char *name;
@@ -73,10 +75,10 @@ struct tevent_req *winbindd_getgrnam_send(TALLOC_CTX *mem_ctx,
 
 	/* Parse domain and groupname */
 
-	ok = parse_domain_user(tmp,
-			       state->name_namespace,
-			       state->name_domain,
-			       state->name_group);
+	ok = parse_domain_user(state, tmp,
+			       &state->name_namespace,
+			       &state->name_domain,
+			       &state->name_group);
 	if (!ok) {
 		DBG_INFO("Could not parse domain user: %s\n", tmp);
 		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -88,7 +90,12 @@ struct tevent_req *winbindd_getgrnam_send(TALLOC_CTX *mem_ctx,
 
 	if ( !*(state->name_domain) || strequal(state->name_domain,
 						get_global_sam_name()) ) {
-		fstrcpy(state->name_domain, get_global_sam_name());
+		TALLOC_FREE(state->name_domain);
+		state->name_domain = talloc_strdup(state,
+						get_global_sam_name());
+		if (tevent_req_nomem(state->name_domain, req)) {
+			return tevent_req_post(req, ev);
+		}
 	}
 
 	subreq = wb_lookupname_send(state, ev,
diff --git a/source3/winbindd/winbindd_getgroups.c b/source3/winbindd/winbindd_getgroups.c
index c2603cc7026..c1c108e4155 100644
--- a/source3/winbindd/winbindd_getgroups.c
+++ b/source3/winbindd/winbindd_getgroups.c
@@ -24,9 +24,9 @@
 
 struct winbindd_getgroups_state {
 	struct tevent_context *ev;
-	fstring namespace;
-	fstring domname;
-	fstring username;
+	char *namespace;
+	char *domname;
+	char *username;
 	struct dom_sid sid;
 	enum lsa_SidType type;
 	uint32_t num_sids;
@@ -76,10 +76,10 @@ struct tevent_req *winbindd_getgroups_send(TALLOC_CTX *mem_ctx,
 		domuser = mapped_user;
 	}
 
-	ok = parse_domain_user(domuser,
-			       state->namespace,
-			       state->domname,
-			       state->username);
+	ok = parse_domain_user(state, domuser,
+			       &state->namespace,
+			       &state->domname,
+			       &state->username);
 	if (!ok) {
 		D_WARNING("Could not parse domain user: %s\n", domuser);
 		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
diff --git a/source3/winbindd/winbindd_getpwnam.c b/source3/winbindd/winbindd_getpwnam.c
index 6dd0d847595..2bf15c0fe7d 100644
--- a/source3/winbindd/winbindd_getpwnam.c
+++ b/source3/winbindd/winbindd_getpwnam.c
@@ -24,9 +24,9 @@
 
 struct winbindd_getpwnam_state {
 	struct tevent_context *ev;
-	fstring namespace;
-	fstring domname;
-	fstring username;
+	char *namespace;
+	char *domname;
+	char *username;
 	struct dom_sid sid;
 	enum lsa_SidType type;
 	struct winbindd_pw pw;
@@ -72,10 +72,11 @@ struct tevent_req *winbindd_getpwnam_send(TALLOC_CTX *mem_ctx,
 		domuser = mapped_user;
 	}
 
-	ok = parse_domain_user(domuser,
-			       state->namespace,
-			       state->domname,
-			       state->username);
+	ok = parse_domain_user(state,
+			       domuser,
+			       &state->namespace,
+			       &state->domname,
+			       &state->username);
 	if (!ok) {
 		D_WARNING("Could not parse domain user: %s\n", domuser);
 		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
diff --git a/source3/winbindd/winbindd_pam.c b/source3/winbindd/winbindd_pam.c
index 5f06465bc3e..6c890c8acd5 100644
--- a/source3/winbindd/winbindd_pam.c
+++ b/source3/winbindd/winbindd_pam.c
@@ -737,7 +737,9 @@ static NTSTATUS winbindd_raw_kerberos_login(TALLOC_CTX *mem_ctx,
 	const char *cc = NULL;
 	const char *principal_s = NULL;
 	char *realm = NULL;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
 	time_t ticket_lifetime = 0;
 	time_t renewal_until = 0;
 	time_t time_offset = 0;
@@ -790,7 +792,11 @@ static NTSTATUS winbindd_raw_kerberos_login(TALLOC_CTX *mem_ctx,
 	/* 3rd step:
 	 * do kerberos auth and setup ccache as the user */
 
-	ok = parse_domain_user(user, name_namespace, name_domain, name_user);
+	ok = parse_domain_user(mem_ctx,
+			user,
+			&name_namespace,
+			&name_domain,
+			&name_user);
 	if (!ok) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
@@ -1110,7 +1116,9 @@ static NTSTATUS winbindd_dual_pam_auth_cached(struct winbindd_domain *domain,
 	TALLOC_CTX *tmp_ctx = NULL;
 	NTSTATUS result = NT_STATUS_LOGON_FAILURE;
 	uint16_t max_allowed_bad_attempts;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
 	struct dom_sid sid;
 	enum lsa_SidType type;
 	uchar new_nt_pass[NT_HASH_LEN];
@@ -1142,7 +1150,11 @@ static NTSTATUS winbindd_dual_pam_auth_cached(struct winbindd_domain *domain,
 
 	/* Parse domain and username */
 
-	ok = parse_domain_user(user, name_namespace, name_domain, name_user);
+	ok = parse_domain_user(tmp_ctx,
+			user,
+			&name_namespace,
+			&name_domain,
+			&name_user);
 	if (!ok) {
 		DBG_DEBUG("parse_domain_user failed\n");
 		result = NT_STATUS_NO_SUCH_USER;
@@ -1444,7 +1456,9 @@ static NTSTATUS winbindd_dual_pam_auth_kerberos(struct winbindd_domain *domain,
 {
 	struct netr_SamInfo6 *info6 = NULL;
 	struct winbindd_domain *contact_domain;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
 	NTSTATUS result;
 	bool ok;
 
@@ -1452,10 +1466,11 @@ static NTSTATUS winbindd_dual_pam_auth_kerberos(struct winbindd_domain *domain,
 
 	/* Parse domain and username */
 
-	ok = parse_domain_user(user,
-			       name_namespace,
-			       name_domain,
-			       name_user);
+	ok = parse_domain_user(mem_ctx,
+			       user,
+			       &name_namespace,
+			       &name_domain,
+			       &name_user);
 	if (!ok) {
 		result = NT_STATUS_INVALID_PARAMETER;
 		goto done;
@@ -2028,7 +2043,9 @@ static NTSTATUS winbindd_dual_pam_auth_samlogon(
 	uint16_t *_validation_level,
 	union netr_Validation **_validation)
 {
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
 	NTSTATUS result;
 	uint8_t authoritative = 1;
 	uint32_t flags = 0;
@@ -2040,7 +2057,11 @@ static NTSTATUS winbindd_dual_pam_auth_samlogon(
 
 	/* Parse domain and username */
 
-	ok = parse_domain_user(user, name_namespace, name_domain, name_user);
+	ok = parse_domain_user(mem_ctx,
+			user,
+			&name_namespace,
+			&name_domain,
+			&name_user);
 	if (!ok) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
@@ -2219,7 +2240,9 @@ NTSTATUS _wbint_PamAuth(struct pipes_struct *p,
 	struct winbindd_domain *domain = wb_child_domain();
 	NTSTATUS result = NT_STATUS_LOGON_FAILURE;
 	NTSTATUS krb5_result = NT_STATUS_OK;
-	fstring name_namespace, name_domain, name_user;
+	char *name_namespace = NULL;
+	char *name_domain = NULL;
+	char *name_user = NULL;
 	char *mapped_user = NULL;
 	const char *domain_user = NULL;
 	uint16_t validation_level = UINT16_MAX;
@@ -2277,10 +2300,11 @@ NTSTATUS _wbint_PamAuth(struct pipes_struct *p,
 		mapped_user = discard_const(r->in.info->username);
 	}
 
-	ok = parse_domain_user(mapped_user,
-			       name_namespace,
-			       name_domain,
-			       name_user);
+	ok = parse_domain_user(p->mem_ctx,
+			       mapped_user,
+			       &name_namespace,
+			       &name_domain,
+			       &name_user);
 	if (!ok) {
 		result = NT_STATUS_INVALID_PARAMETER;
 		goto done;
@@ -2935,7 +2959,9 @@ NTSTATUS _wbint_PamAuthChangePassword(struct pipes_struct *p,
 	struct userPwdChangeFailureInformation *reject = NULL;
 	NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
 	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-	fstring namespace, domain, user;
+	char *namespace = NULL;
+	char *domain = NULL;
+	char *user = NULL;
 	struct dcerpc_binding_handle *b = NULL;
 	bool ok;
 	pid_t client_pid;
@@ -2956,10 +2982,11 @@ NTSTATUS _wbint_PamAuthChangePassword(struct pipes_struct *p,
 	DBG_NOTICE("[%"PRIu32"]: dual pam chauthtok %s\n",
 		   client_pid, r->in.user);
 
-	ok = parse_domain_user(r->in.user,
-			       namespace,
-			       domain,
-			       user);
+	ok = parse_domain_user(p->mem_ctx,
+			       r->in.user,
+			       &namespace,
+			       &domain,
+			       &user);
 	if (!ok) {
 		goto done;
 	}
@@ -3221,11 +3248,14 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 				struct wbint_PamAuthCrapChangePassword *r)
 {
 	NTSTATUS result;
-	fstring  namespace, domain, user;
+	char *namespace = NULL;
+	char *domain = NULL;
+	char *user = NULL;
 	struct policy_handle dom_pol;
 	struct winbindd_domain *contact_domain = wb_child_domain();
 	struct rpc_pipe_client *cli = NULL;
 	struct dcerpc_binding_handle *b = NULL;
+	TALLOC_CTX *frame = talloc_stackframe();
 	pid_t client_pid;
 
 	ZERO_STRUCT(dom_pol);
@@ -3241,10 +3271,6 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	domain[0] = '\0';
-	namespace[0] = '\0';
-	user[0] = '\0';
-
 	DBG_NOTICE("[%"PRIu32"]: pam change pswd auth crap domain: %s "
 		   "user: %s\n", client_pid, r->in.domain, r->in.user);
 
@@ -3256,14 +3282,22 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 	}
 
 	if (r->in.domain != NULL && strlen(r->in.domain) > 0) {
-		fstrcpy(domain, r->in.domain);
+		user = talloc_strdup(frame, "");
+		namespace = talloc_strdup(frame, "");
+		domain = talloc_strdup(frame, r->in.domain);
+		if (domain == NULL || user == NULL || namespace == NULL) {
+			result = NT_STATUS_NO_MEMORY;
+			goto done;
+		}
+
 	} else {
 		bool ok;
 
-		ok = parse_domain_user(r->in.user,
-				       namespace,
-				       domain,
-				       user);
+		ok = parse_domain_user(frame,
+				       r->in.user,
+				       &namespace,
+				       &domain,
+				       &user);
 		if (!ok) {
 			result = NT_STATUS_INVALID_PARAMETER;
 			goto done;
@@ -3278,7 +3312,12 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 	}
 
 	if (!*domain && lp_winbind_use_default_domain()) {
-		fstrcpy(domain,lp_workgroup());
+		TALLOC_FREE(domain);
+		domain = talloc_strdup(frame, lp_workgroup());
+		if (domain == NULL) {
+			result = NT_STATUS_NO_MEMORY;
+			goto done;
+		}
 	}
 
 	if (!is_allowed_domain(domain)) {
@@ -3291,7 +3330,12 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 	}
 
 	if(!*user) {
-		fstrcpy(user, r->in.user);
+		TALLOC_FREE(user);
+		user = talloc_strdup(frame, r->in.user);
+		if (user == NULL) {
+			result = NT_STATUS_NO_SUCH_USER;
+			goto done;
+		}
 	}
 
 	/* Get sam handle */
@@ -3337,7 +3381,7 @@ NTSTATUS _wbint_PamAuthCrapChangePassword(struct pipes_struct *p,
 	       domain, user,
 	       nt_errstr(result),
 	       nt_status_to_pam(result)));
-
+	TALLOC_FREE(frame);
 	return result;
 }
 
diff --git a/source3/winbindd/winbindd_pam_auth.c b/source3/winbindd/winbindd_pam_auth.c
index a59f33ef631..431da098f0b 100644
--- a/source3/winbindd/winbindd_pam_auth.c
+++ b/source3/winbindd/winbindd_pam_auth.c
@@ -70,9 +70,9 @@ static NTSTATUS fake_password_policy(struct winbindd_response *r,
 
 struct winbindd_pam_auth_state {
 	struct wbint_PamAuth *r;
-	fstring name_namespace;
-	fstring name_domain;
-	fstring name_user;
+	char *name_namespace;
+	char *name_domain;
+	char *name_user;
 };
 
 static void winbindd_pam_auth_done(struct tevent_req *subreq);
@@ -86,6 +86,7 @@ struct tevent_req *winbindd_pam_auth_send(TALLOC_CTX *mem_ctx,
 	struct winbindd_pam_auth_state *state;
 	struct winbindd_domain *domain;
 	char *mapped = NULL;
+	char *auth_user = NULL;
 	NTSTATUS status;
 	bool ok;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list