summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2007-04-12 21:10:06 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:19:19 -0500
commit59523f55a92505967ae1706f8965bebe3f91caf2 (patch)
tree39f6c5451b963feb2140e281a2b1cd8d8fcc5944
parent9f41ff47d0efc17cc4bf2f210aa05d2865798386 (diff)
downloadsamba-59523f55a92505967ae1706f8965bebe3f91caf2.tar.gz
samba-59523f55a92505967ae1706f8965bebe3f91caf2.tar.bz2
samba-59523f55a92505967ae1706f8965bebe3f91caf2.zip
r22204: Workaround to quickly close bug #4508
This hack makes thing work, but we will need to try again to make the getpw* calls fully async, that's the real fix. (This used to be commit 2552859b3d9e28d5f25b339f5d24a8d2dc36b46b)
-rw-r--r--source3/nsswitch/idmap.c36
-rw-r--r--source3/nsswitch/winbindd.c3
-rw-r--r--source3/nsswitch/winbindd_dual.c3
3 files changed, 36 insertions, 6 deletions
diff --git a/source3/nsswitch/idmap.c b/source3/nsswitch/idmap.c
index de98c81f5a..3a3c2bf05f 100644
--- a/source3/nsswitch/idmap.c
+++ b/source3/nsswitch/idmap.c
@@ -84,6 +84,24 @@ static struct idmap_alloc_methods *get_alloc_methods(struct idmap_alloc_backend
return NULL;
}
+/* part of a quick hack to avoid loops, need to be sorted out correctly later on */
+static BOOL idmap_in_own_child;
+
+static BOOL idmap_is_in_own_child(void)
+{
+ return idmap_in_own_child;
+}
+
+void reset_idmap_in_own_child(void)
+{
+ idmap_in_own_child = False;
+}
+
+void set_idmap_in_own_child(void)
+{
+ idmap_in_own_child = True;
+}
+
/**********************************************************************
Allow a module to register itself as a method.
**********************************************************************/
@@ -801,12 +819,17 @@ static NTSTATUS idmap_new_mapping(TALLOC_CTX *ctx, struct id_map *map)
if ( ! NT_STATUS_IS_OK(ret)) {
return NT_STATUS_NONE_MAPPED;
}
-
- /* by default calls to winbindd are disabled
- the following call will not recurse so this is safe */
- winbind_on();
- wbret = winbind_lookup_sid(ctx, map->sid, &domname, &name, &sid_type);
- winbind_off();
+
+ /* quick hack to make things work, will need proper fix later on */
+ if (idmap_is_in_own_child()) {
+ /* by default calls to winbindd are disabled
+ the following call will not recurse so this is safe */
+ winbind_on();
+ wbret = winbind_lookup_sid(ctx, map->sid, &domname, &name, &sid_type);
+ winbind_off();
+ } else {
+ wbret = winbindd_lookup_name_by_sid(ctx, map->sid, &domname, &name, &sid_type);
+ }
/* check if this is a valid SID and then map it */
if (wbret) {
@@ -1395,3 +1418,4 @@ char *idmap_fetch_secret(const char *backend, bool alloc,
return ret;
}
+
diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c
index 0edf3664b7..39bd66989c 100644
--- a/source3/nsswitch/winbindd.c
+++ b/source3/nsswitch/winbindd.c
@@ -1010,6 +1010,9 @@ int main(int argc, char **argv, char **envp)
namecache_enable();
+ /* quick hack to avoid a loop in idmap, proper fix later */
+ reset_idmap_in_own_child();
+
/* Winbind daemon initialisation */
if ( ! NT_STATUS_IS_OK(idmap_init_cache()) ) {
diff --git a/source3/nsswitch/winbindd_dual.c b/source3/nsswitch/winbindd_dual.c
index 26debd2674..20cf55b51d 100644
--- a/source3/nsswitch/winbindd_dual.c
+++ b/source3/nsswitch/winbindd_dual.c
@@ -921,6 +921,9 @@ static BOOL fork_domain_child(struct winbindd_child *child)
child);
}
+ /* quick hack to avoid a loop in idmap, proper fix later */
+ set_idmap_in_own_child();
+
while (1) {
int ret;