diff options
author | Jeremy Allison <jra@samba.org> | 2008-06-08 14:19:44 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2008-06-08 14:19:44 -0700 |
commit | 1db2dc1931d0a91aa6b8d9359fd395ec8a11cd44 (patch) | |
tree | 67e142e468293c3ec2eb59cea9127d0b86aad53a /source3/winbindd | |
parent | d1e0c7f0c1a62030e08fd3ae00ec8ed07c79aa72 (diff) | |
download | samba-1db2dc1931d0a91aa6b8d9359fd395ec8a11cd44.tar.gz samba-1db2dc1931d0a91aa6b8d9359fd395ec8a11cd44.tar.bz2 samba-1db2dc1931d0a91aa6b8d9359fd395ec8a11cd44.zip |
Bugfix noticed by Herb. On using the again: tag as a
goto target we were not reinitializing the array counts.
From Herb:
This is in the file nsswitch/winbindd_cm.c (samba-3.0.30) line 1236
We have a label again: where we keep trying to find the name of the DC
from the list of IPs returned by get_dcs. If we fail to figure out the
name we do a goto again at the end of the function. The problem is we
don't reset the num_dcs, num_addrs, etc and free the memory in the
various arrays. This seems wrong to me. I have a winbindd core where
I have 9 IPs returned for the DCs but at the time of the crash num_dcs
is 87 and if I look through the array dcs it keeps repeating entries
from the same group of 9
Jerry, Volker and Guenther please check.
Jeremy.
(This used to be commit 15f464321a7c71a86b747918343746050d286655)
Diffstat (limited to 'source3/winbindd')
-rw-r--r-- | source3/winbindd/winbindd_cm.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index ae51c268bd..860fabbf72 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -1257,6 +1257,8 @@ static bool find_new_dc(TALLOC_CTX *mem_ctx, int i, fd_index; + *fd = -1; + again: if (!get_dcs(mem_ctx, domain, &dcs, &num_dcs) || (num_dcs == 0)) return False; @@ -1318,6 +1320,19 @@ static bool find_new_dc(TALLOC_CTX *mem_ctx, /* We can not continue without the DC's name */ winbind_add_failed_connection_entry(domain, dcs[fd_index].name, NT_STATUS_UNSUCCESSFUL); + + /* Throw away all arrays as we're doing this again. */ + TALLOC_FREE(dcs); + num_dcs = 0; + + TALLOC_FREE(dcnames); + num_dcnames = 0; + + TALLOC_FREE(addrs); + num_addrs = 0; + + *fd = -1; + goto again; } |