summaryrefslogtreecommitdiff
path: root/source3/winbindd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-08-16 19:23:38 -0700
committerJeremy Allison <jra@samba.org>2008-08-16 19:23:38 -0700
commitee6c02f7c8bc92190b9f5474057f5885f29c2f8a (patch)
treeeda184fcae43548cc60e67ec6a5f7e1658ef3aad /source3/winbindd
parent165f5c0c0a99d7da598a3c27355abaed1161cc7f (diff)
downloadsamba-ee6c02f7c8bc92190b9f5474057f5885f29c2f8a.tar.gz
samba-ee6c02f7c8bc92190b9f5474057f5885f29c2f8a.tar.bz2
samba-ee6c02f7c8bc92190b9f5474057f5885f29c2f8a.zip
Fix bug 5696. 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(). Jeremy. (This used to be commit 5293af6c3cbfdde340e6add47b914b6ee6fd7b6f)
Diffstat (limited to 'source3/winbindd')
-rw-r--r--source3/winbindd/winbindd_passdb.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/source3/winbindd/winbindd_passdb.c b/source3/winbindd/winbindd_passdb.c
index 8387565a74..5677c01be1 100644
--- a/source3/winbindd/winbindd_passdb.c
+++ b/source3/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;
}