winbind patch

Rafal Szczesniak mimir at diament.ists.pwr.wroc.pl
Sun Sep 1 05:25:01 GMT 2002


This is proposed fix to have completed trusted domains enumeration
in winbind. This implementation checks returned code and depending
on it does another call (STATUS_MORE_ENTRIES) or exits.
As stored domain names and sids needs potential reallocation,
I expect comments on this matter.

of course, comments/feedbacks are welcome


-- 
cheers,
+------------------------------------------------------------+
|Rafal 'Mimir' Szczesniak <mimir at diament.ists.pwr.wroc.pl>   |
|*BSD, GNU/Linux and Samba                                  /
|__________________________________________________________/
-------------- next part --------------
Index: winbindd.c
===================================================================
RCS file: /cvsroot/samba/source/nsswitch/winbindd.c,v
retrieving revision 1.65
diff -u -r1.65 winbindd.c
--- winbindd.c	27 Aug 2002 19:43:19 -0000	1.65
+++ winbindd.c	1 Sep 2002 09:16:32 -0000
@@ -750,7 +750,7 @@
 	printf("\t-h                show this help message\n");
 }
 
- int main(int argc, char **argv)
+int main(int argc, char **argv)
 {
 	extern BOOL AllowDebugChange;
 	extern pstring global_myname;
Index: winbindd_cm.c
===================================================================
RCS file: /cvsroot/samba/source/nsswitch/winbindd_cm.c,v
retrieving revision 1.44
diff -u -r1.44 winbindd_cm.c
--- winbindd_cm.c	30 Aug 2002 10:46:59 -0000	1.44
+++ winbindd_cm.c	1 Sep 2002 09:16:34 -0000
@@ -433,7 +433,7 @@
 	result = cli_full_connection(&(new_conn->cli), global_myname, new_conn->controller, 
 				     &dc_ip, 0, "IPC$", 
 				     "IPC", ipc_username, ipc_domain, 
-				     ipc_password, 0);
+				     ipc_password, lp_use_spnego() ? 0 : CLI_FULL_CONNECTION_DONT_SPNEGO);
 
 	SAFE_FREE(ipc_username);
 	SAFE_FREE(ipc_domain);
Index: winbindd_rpc.c
===================================================================
RCS file: /cvsroot/samba/source/nsswitch/winbindd_rpc.c,v
retrieving revision 1.31
diff -u -r1.31 winbindd_rpc.c
--- winbindd_rpc.c	5 Aug 2002 02:47:16 -0000	1.31
+++ winbindd_rpc.c	1 Sep 2002 09:16:35 -0000
@@ -3,8 +3,9 @@
 
    Winbind rpc backend functions
 
-   Copyright (C) Tim Potter 2000-2001
-   Copyright (C) Andrew Tridgell 2001
+   Copyright (C) Tim Potter  2000-2001
+   Copyright (C) Andrew Tridgell  2001
+   Copyright (C) Rafal Szczesniak 2002
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -581,19 +582,83 @@
 	CLI_POLICY_HND *hnd;
 	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 	uint32 enum_ctx = 0;
+	
+	/* this gives us 'quantized' allocation of names/sids arrays */
+	const int chunk_size = 4;
+	int chunk_num = 1;
 
 	DEBUG(3,("rpc: trusted_domains\n"));
 
 	*num_domains = 0;
 	*alt_names = NULL;
-
+	
+	*names = talloc(mem_ctx, sizeof(char*) * chunk_size);
+	if (!*names) {
+		DEBUG(0, ("Trusted domain names array couldn't be allocated: out of memory\n"));
+		return NT_STATUS_NO_MEMORY;
+	};
+	
+	*dom_sids = talloc(mem_ctx, sizeof(DOM_SID) * chunk_size);
+	if (!*dom_sids) {
+		DEBUG(0, ("Trusted domain sids array couldn't be allocated: out of memory\n"));
+		return NT_STATUS_NO_MEMORY;
+	};
+	
 	if (!(hnd = cm_get_lsa_handle(lp_workgroup())))
-		goto done;
+		return result;
+
+	DEBUG(5, ("Starting trusted domains enumeration.\n"));
 
-	result = cli_lsa_enum_trust_dom(hnd->cli, mem_ctx,
-					&hnd->pol, &enum_ctx,
-					num_domains, names, dom_sids);
-done:
+	do {
+		/* data returned in a single cli_lsa_enum_trust_dom call */
+		uint32 num_dom = 0;
+		char** domain_names;
+		DOM_SID* domain_sids;
+		
+		result = cli_lsa_enum_trust_dom(hnd->cli, mem_ctx,
+		                                &hnd->pol, &enum_ctx,
+		                                &num_dom, &domain_names, &domain_sids);
+
+		DEBUG(10, ("Returned %d trusted domain entries. Current enum_ctx = %d, nt_status = %s\n",
+		          num_dom, enum_ctx, nt_errstr(result)));
+						
+		/* collect returned entries */
+		while ((enum_ctx - *num_domains <= num_dom) && (enum_ctx - *num_domains > 0)) {
+			if (!domain_names[enum_ctx - *num_domains - 1]) continue;
+			
+			(*names)[*num_domains] = domain_names[enum_ctx - *num_domains - 1];
+			sid_copy(&(*dom_sids)[*num_domains], &(domain_sids[enum_ctx - *num_domains - 1]));
+			
+			DEBUGADD(100, ("Collecting trusted domain (%d): %s %s\n", *num_domains,
+			              (*names)[*num_domains], sid_string_static(&(*dom_sids)[*num_domains])));
+			(*num_domains)++;
+			
+			/* check if arrays grows beyond their current size */
+			if (!(*num_domains < chunk_size * chunk_num)) {
+				chunk_num++;
+			
+				*names = talloc_realloc(mem_ctx, *names, sizeof(char*) * chunk_size * chunk_num);
+				if (!(*names) && sizeof (*names) != sizeof(char*) * chunk_size * chunk_num) {
+					DEBUG(0, ("Realloc of trusted domain names array failed (chunk_size = %d, chunk_num = %d)\n",
+					           chunk_size, chunk_num));
+					return NT_STATUS_NO_MEMORY;
+				}
+				
+				*dom_sids = talloc_realloc(mem_ctx, *dom_sids, sizeof(DOM_SID) * chunk_size * chunk_num);
+				if (!(*dom_sids) && sizeof(*dom_sids) * chunk_size * chunk_num) {
+					DEBUG(0, ("Realloc of trusted domain sids array failed (chunk_size = %d, chunk_num = %d)\n",
+					          chunk_size, chunk_num));
+					return NT_STATUS_NO_MEMORY;
+				}				
+				
+				DEBUG(10, ("Realloc of trusted domain arrays succeeded. Current chunk size = %d, chunk_num = %d\n",
+				          chunk_size, chunk_num));
+			};
+			
+		};
+						
+	} while NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES);
+	
 	return result;
 }
 
Index: winbindd_util.c
===================================================================
RCS file: /cvsroot/samba/source/nsswitch/winbindd_util.c,v
retrieving revision 1.79
diff -u -r1.79 winbindd_util.c
--- winbindd_util.c	18 Aug 2002 15:46:03 -0000	1.79
+++ winbindd_util.c	1 Sep 2002 09:16:36 -0000
@@ -164,7 +164,7 @@
 		int i;
 
 		result = domain->methods->trusted_domains(domain, mem_ctx, &num_domains,
-							  &names, &alt_names, &dom_sids);
+		                                          &names, &alt_names, &dom_sids);
 		if (!NT_STATUS_IS_OK(result)) {
 			continue;
 		}
@@ -173,9 +173,8 @@
 		   the access methods of its parent */
 		for(i = 0; i < num_domains; i++) {
 			DEBUG(10,("Found domain %s\n", names[i]));
-			add_trusted_domain(names[i], 
-					   alt_names?alt_names[i]:NULL, 
-					   domain->methods, &dom_sids[i]);
+			add_trusted_domain(names[i], alt_names?alt_names[i]:NULL,
+			                   domain->methods, &dom_sids[i]);
 		}
 	}
 
@@ -195,8 +194,10 @@
 	/* Add ourselves as the first entry */
 	domain = add_trusted_domain(lp_workgroup(), NULL, &cache_methods, NULL);
 
-	/* Now we *must* get the domain sid for our primary domain. Go into
-	   a holding pattern until that is available */
+	/* 
+	 * Now we *must* get the domain sid for our primary domain. Go into
+	 * a holding pattern until that is available
+	 */
 
 	result = cache_methods.domain_sid(domain, &domain->sid);
 	while (!NT_STATUS_IS_OK(result)) {


More information about the samba-technical mailing list