diff options
author | brian <brian@FreeBSD.org> | 1999-11-09 23:21:47 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1999-11-09 23:21:47 +0000 |
commit | f87b3817a2d1c9cce4910b3a14e946899a2632d7 (patch) | |
tree | b2fac59922434fa4b6caa2a33bec4e837ab1c98f /usr.sbin/ppp/datalink.c | |
parent | dbc696f018d90f81572242c52c51eb5f0f25f84f (diff) | |
download | FreeBSD-src-f87b3817a2d1c9cce4910b3a14e946899a2632d7.zip FreeBSD-src-f87b3817a2d1c9cce4910b3a14e946899a2632d7.tar.gz |
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.
Diffstat (limited to 'usr.sbin/ppp/datalink.c')
-rw-r--r-- | usr.sbin/ppp/datalink.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c index 40f22f1..31c74c0 100644 --- a/usr.sbin/ppp/datalink.c +++ b/usr.sbin/ppp/datalink.c @@ -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: |