Winbind: Prevent cycle in children list when reaping dead child processes.
authorGerald W. Carter <jerry@samba.org>
Wed, 30 Apr 2008 15:09:43 +0000 (10:09 -0500)
committerGerald W. Carter <jerry@samba.org>
Wed, 30 Apr 2008 15:44:13 +0000 (10:44 -0500)
commit5a270bc99f52483f168d662d843672d05be74473
treedd9184173887b764811b21608be1d557863559a7
parent5dff914f9ebcda63b9e3c78d6d0bb5a3212c6690
Winbind: Prevent cycle in children list when reaping dead child processes.

Thanks to Glenn Curtis and Kyle Stemen @ Likewise.  Their explanation is:

    In winbindd_dual.c, there is a list of children processes that
    is maintained using macros DTLIST_ADD and DTLIST_REMOVE. In the
    case when a scheduled_async_request fails, the particular child
    was located in the list, and its attributes were cleared out
    and it was reused for a subsequent async request. The bug was that
    the new request would queue the same node into the doubly-linked
    list and would result in list->next pointing to the same node as
    list itself. This would set up an infinite loop in the processing of
    the for loop when the list of children was referenced.

    Solution was to fully remove the child node from the list, such that
    it could be inserted without risk of being inserted twice.

Note that the child is re-added to the list in fork_domain_child() again.
(cherry picked from commit b379b5b5d8a6daccc69aaf2be6d9a6e276e7dd78)
source/winbindd/winbindd_dual.c