• Alfonso Sánchez-Beato's avatar
    core/pppd-plugin: wait to recover port settings before notifying death · 61b4f31d
    Alfonso Sánchez-Beato authored
    pppd restores the previous settings for the serial port it uses right
    before exiting. It is especially important to do so because otherwise
    ModemManager is not able to recover the port as it can receive a hangup
    event from the port due to CLOCAL not being restored.  However, there is
    currently a race condition that produces this issue. This is because
    when PHASE_DEAD is notified, pppd still has not restored the port
    settings - it does that a bit later, in the die() function.
    
    This patch delays notifying PHASE_DEAD until when the exitnotify() hook
    is called by pppd: when this happens the port settings have already been
    restored.
    
    There were previously efforts to fix this in commit fe090c34, so
    PHASE_DEAD was used instead of PHASE_DISCONNECT to notify MM that the
    port was disconnected, but that still early to ensure that the port
    settings are restored.
    
    The MM traces seen when the bug is triggered are:
    
    ModemManager[2158]: <warn>  (ttyACM1): could not re-acquire serial port lock: (5) Input/output error
    ModemManager[2158]: <warn>  Couldn't load Operator Code: 'Cannot run sequence: 'Could not open serial device ttyACM1: it has been forced close'
    
    https://mail.gnome.org/archives/networkmanager-list/2019-June/msg00014.html
    
    (cherry picked from commit a251712a)
    (cherry picked from commit 3caa0657)
    61b4f31d
Name
Last commit
Last update
clients Loading commit data...
contrib Loading commit data...
data Loading commit data...
dispatcher Loading commit data...
docs Loading commit data...
examples Loading commit data...
introspection Loading commit data...
libnm Loading commit data...
libnm-core Loading commit data...
libnm-glib Loading commit data...
libnm-util Loading commit data...
m4 Loading commit data...
man Loading commit data...
po Loading commit data...
shared Loading commit data...
src Loading commit data...
tools Loading commit data...
vapi Loading commit data...
.dir-locals.el Loading commit data...
.gitignore Loading commit data...
.gitlab-ci.yml Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING Loading commit data...
COPYING Loading commit data...
ChangeLog Loading commit data...
MAINTAINERS Loading commit data...
Makefile.am Loading commit data...
Makefile.examples Loading commit data...
Makefile.glib Loading commit data...
Makefile.vapigen Loading commit data...
NEWS Loading commit data...
NetworkManager.pc.in Loading commit data...
README Loading commit data...
TODO Loading commit data...
autogen.sh Loading commit data...
config-extra.h.meson Loading commit data...
config.h.meson Loading commit data...
configure.ac Loading commit data...
linker-script-binary.ver Loading commit data...
linker-script-devices.ver Loading commit data...
linker-script-settings.ver Loading commit data...
meson.build Loading commit data...
meson_options.txt Loading commit data...
valgrind.suppressions Loading commit data...
zanata.xml Loading commit data...