Another showstopper for 3.2.2.

Jeremy Allison jra at samba.org
Sun Aug 17 02:22:42 GMT 2008


On Sat, Aug 16, 2008 at 05:44:13PM -0700, Jeremy Allison wrote:
> https://bugzilla.samba.org/show_bug.cgi?id=5696
> 
> I've reproduced it - will try and get a fix before
> Monday. But we can't ship with this one 
> (force group = +name not working if name is also
> a unix username and winbindd is running).

Ok, the fix is attached. The problem was when smbd
was asking for a winbindd name to SID lookup of
"Unix Group\name" where "name" was also a valid username,
the winbindd passdb lookup of that name was losing the
domain string info before calling lookup name (ie. lookup_name()
was being called with just the string "name", not the
full string "Unix Group\name").

The passdb backend of winbindd has to cope with
not only names from it's own global SAM domain,
but it does lookups for BUILTIN and "Unix User"
and "Unix Group" also, so making it guess by
losing the domain string is "A Bad Idea" (tm) :-).

Note that as winbind globally calls winbind_off()
at startup, it's safe for winbind to call sys_getgrnam()
to do the "Unix Group" lookup from inside lookup_name().

Jerry, Volker, Simo, Guenther and Michael (and
anyone else who has ever had a hand in winbindd)
- all PLEASE CHECK !!!!

Thanks,

Jeremy.
-------------- next part --------------
diff --git a/source/winbindd/winbindd_passdb.c b/source/winbindd/winbindd_passdb.c
index 8387565..5677c01 100644
--- a/source/winbindd/winbindd_passdb.c
+++ b/source/winbindd/winbindd_passdb.c
@@ -94,6 +94,7 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
 			    DOM_SID *sid,
 			    enum lsa_SidType *type)
 {
+	const char *fullname;
 	uint32 flags = LOOKUP_NAME_ALL;
 
 	switch ( original_cmd ) {
@@ -107,12 +108,27 @@ static NTSTATUS name_to_sid(struct winbindd_domain *domain,
 		break;
 	}
 	
-	DEBUG(10, ("Finding name %s\n", name));
+	if (domain_name && domain_name[0] && strchr_m(name, '\\') == NULL) {
+		fullname = talloc_asprintf(mem_ctx, "%s\\%s",
+				domain_name, name);
+		if (fullname == NULL) {
+			return NT_STATUS_NO_MEMORY;
+		}
+	} else {
+		fullname = name;
+	}
+
+	DEBUG(10, ("Finding fullname %s\n", fullname));
 
-	if ( !lookup_name( mem_ctx, name, flags, NULL, NULL, sid, type ) ) {
+	if ( !lookup_name( mem_ctx, fullname, flags, NULL, NULL, sid, type ) ) {
 		return NT_STATUS_NONE_MAPPED;
 	}
 
+	DEBUG(10, ("name_to_sid for %s returned %s (%s)\n",
+		fullname,
+		sid_string_dbg(sid),
+		sid_type_lookup((uint32)*type)));
+		
 	return NT_STATUS_OK;
 }
 


More information about the samba-technical mailing list