--- pppd/auth.c +++ pppd/auth.c @@ -546,6 +546,8 @@ int unit; { char *msg; + if (phase == PHASE_DISCONNECT) /* we are called via link_terminated, must be ignored */ + return; new_phase(PHASE_SERIALCONN); @@ -658,6 +660,7 @@ the_channel->disconnect(); devfd = -1; } + /* not only disconnect, cleanup should also be called to close the devices */ if (the_channel->cleanup) (*the_channel->cleanup)();