diff options
author | Simo Sorce <idra@samba.org> | 2007-04-12 21:10:06 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:19:19 -0500 |
commit | 59523f55a92505967ae1706f8965bebe3f91caf2 (patch) | |
tree | 39f6c5451b963feb2140e281a2b1cd8d8fcc5944 | |
parent | 9f41ff47d0efc17cc4bf2f210aa05d2865798386 (diff) | |
download | samba-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.c | 36 | ||||
-rw-r--r-- | source3/nsswitch/winbindd.c | 3 | ||||
-rw-r--r-- | source3/nsswitch/winbindd_dual.c | 3 |
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; |