Don't recurse into datalink_UpdateSet() after
doing a HangupDone(). The HangupDone() may fuel bundle_CleanDatalinks(), and if so, the bogus UpdateSet() ends up select()ing on a closed descriptor..... Change the main `do/while' loop to a `for' loop so that any `continue's do the bundle_CleanDatalinks() & bundle_IsDead() bit.
This commit is contained in:
parent
647fc635a3
commit
da8b70349b
@ -332,9 +332,11 @@ datalink_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e,
|
||||
if (dl->script.run) {
|
||||
datalink_NewState(dl, DATALINK_HANGUP);
|
||||
chat_Init(&dl->chat, dl->physical, dl->cfg.script.hangup, NULL);
|
||||
} else
|
||||
return datalink_UpdateSet(d, r, w, e, n);
|
||||
} else {
|
||||
datalink_HangupDone(dl);
|
||||
return datalink_UpdateSet(d, r, w, e, n);
|
||||
return 0; /* Maybe bundle_CleanDatalinks() has something to do */
|
||||
}
|
||||
}
|
||||
|
||||
case DATALINK_HANGUP:
|
||||
|
@ -506,7 +506,7 @@ DoLoop(struct bundle *bundle)
|
||||
|
||||
probe_Init(&probe);
|
||||
|
||||
do {
|
||||
for (; !bundle_IsDead(bundle); bundle_CleanDatalinks(bundle)) {
|
||||
nfds = 0;
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&wfds);
|
||||
@ -619,7 +619,7 @@ DoLoop(struct bundle *bundle)
|
||||
t.tv_usec = 100000;
|
||||
select(0, NULL, NULL, NULL, &t);
|
||||
}
|
||||
} while (bundle_CleanDatalinks(bundle), !bundle_IsDead(bundle));
|
||||
}
|
||||
|
||||
log_Printf(LogDEBUG, "DoLoop done.\n");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user