[SCM] Samba Shared Repository - branch v3-0-test updated - release-3-0-28-120-g55c7aaf

Jeremy Allison jra at samba.org
Wed Feb 6 01:06:59 GMT 2008


The branch, v3-0-test has been updated
       via  55c7aaff897cde9dc9a40a07c96297a232539e81 (commit)
      from  d15d99da3a1a6bcb1be196de0a193b75151006e9 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-0-test


- Log -----------------------------------------------------------------
commit 55c7aaff897cde9dc9a40a07c96297a232539e81
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Feb 5 17:06:25 2008 -0800

    Back-ported fix from 3.2 (mainly from Bo Yang <boyang at novell.com>)
    to fix bad private_data pointer in winbindd_lookupname_async().
    Jeremy.

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

Summary of changes:
 source/nsswitch/winbindd_async.c |   57 +++++++++++++++++++++++++------------
 1 files changed, 38 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/nsswitch/winbindd_async.c b/source/nsswitch/winbindd_async.c
index 32d4e66..ad136bd 100644
--- a/source/nsswitch/winbindd_async.c
+++ b/source/nsswitch/winbindd_async.c
@@ -782,6 +782,12 @@ enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain,
  This is the second callback after contacting the forest root
 ********************************************************************/
 
+struct lookupname_state {
+	char *dom_name;
+	char *name;
+	void *caller_private_data;
+};
+
 static void lookupname_recv2(TALLOC_CTX *mem_ctx, BOOL success,
 			    struct winbindd_response *response,
 			    void *c, void *private_data)
@@ -790,27 +796,28 @@ static void lookupname_recv2(TALLOC_CTX *mem_ctx, BOOL success,
 		     enum lsa_SidType type) =
 		(void (*)(void *, BOOL, const DOM_SID *, enum lsa_SidType))c;
 	DOM_SID sid;
+	struct lookupname_state *s = talloc_get_type_abort(private_data, struct lookupname_state);
 
 	if (!success) {
 		DEBUG(5, ("Could not trigger lookup_name\n"));
-		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 		return;
 	}
 
 	if (response->result != WINBINDD_OK) {
 		DEBUG(5, ("lookup_name returned an error\n"));
-		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 		return;
 	}
 
 	if (!string_to_sid(&sid, response->data.sid.sid)) {
 		DEBUG(0, ("Could not convert string %s to sid\n",
 			  response->data.sid.sid));
-		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 		return;
 	}
 
-	cont(private_data, True, &sid,
+	cont(s->caller_private_data, True, &sid,
 	     (enum lsa_SidType)response->data.sid.type);
 }
 
@@ -826,36 +833,32 @@ static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,
 		     enum lsa_SidType type) =
 		(void (*)(void *, BOOL, const DOM_SID *, enum lsa_SidType))c;
 	DOM_SID sid;
+	struct lookupname_state *s = talloc_get_type_abort(private_data, struct lookupname_state);
 
 	if (!success) {
 		DEBUG(5, ("lookupname_recv: lookup_name() failed!\n"));
-		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 		return;
 	}
 
 	if (response->result != WINBINDD_OK) {
 		/* Try again using the forest root */
 		struct winbindd_domain *root_domain = find_root_domain();
-		struct winbindd_cli_state *state = (struct winbindd_cli_state*)private_data;		
-		struct winbindd_request request;		
-		char *name_domain, *name_account;
-		
+		struct winbindd_request request;
+
 		if ( !root_domain ) {
 			DEBUG(5,("lookupname_recv: unable to determine forest root\n"));
-			cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+			cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 			return;
 		}
 
-		name_domain  = state->request.data.name.dom_name;
-		name_account = state->request.data.name.name;	
-
 		ZERO_STRUCT(request);
 		request.cmd = WINBINDD_LOOKUPNAME;
-		fstrcpy(request.data.name.dom_name, name_domain);
-		fstrcpy(request.data.name.name, name_account);
+		fstrcpy(request.data.name.dom_name, s->dom_name);
+		fstrcpy(request.data.name.name, s->name);
 
 		do_async_domain(mem_ctx, root_domain, &request, lookupname_recv2,
-				(void *)cont, private_data);
+				(void *)cont, s);
 
 		return;
 	}
@@ -863,11 +866,11 @@ static void lookupname_recv(TALLOC_CTX *mem_ctx, BOOL success,
 	if (!string_to_sid(&sid, response->data.sid.sid)) {
 		DEBUG(0, ("Could not convert string %s to sid\n",
 			  response->data.sid.sid));
-		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		cont(s->caller_private_data, False, NULL, SID_NAME_UNKNOWN);
 		return;
 	}
 
-	cont(private_data, True, &sid,
+	cont(s->caller_private_data, True, &sid,
 	     (enum lsa_SidType)response->data.sid.type);
 }
 
@@ -886,6 +889,7 @@ void winbindd_lookupname_async(TALLOC_CTX *mem_ctx,
 {
 	struct winbindd_request request;
 	struct winbindd_domain *domain;
+	struct lookupname_state *s;
 
 	if ( (domain = find_lookup_domain_from_name(dom_name)) == NULL ) {
 		DEBUG(5, ("Could not find domain for name %s\n", dom_name));
@@ -898,8 +902,23 @@ void winbindd_lookupname_async(TALLOC_CTX *mem_ctx,
 	fstrcpy(request.data.name.dom_name, dom_name);
 	fstrcpy(request.data.name.name, name);
 
+	if ( (s = TALLOC_ZERO_P(mem_ctx, struct lookupname_state)) == NULL ) {
+		DEBUG(0, ("winbindd_lookupname_async: talloc failed\n"));
+		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		return;
+	}
+
+	s->dom_name = talloc_strdup( s, dom_name );
+	s->name     = talloc_strdup( s, name );
+	if (!s->dom_name || !s->name) {
+		cont(private_data, False, NULL, SID_NAME_UNKNOWN);
+		return;
+	}
+
+	s->caller_private_data = private_data;
+
 	do_async_domain(mem_ctx, domain, &request, lookupname_recv,
-			(void *)cont, private_data);
+			(void *)cont, s);
 }
 
 enum winbindd_result winbindd_dual_lookupname(struct winbindd_domain *domain,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list