~connman-maintainers/ofono/trunk

Viewing all changes in revision 8786.

  • Committer: Denis Kenzior
  • Author(s): Jimmy Gysens
  • Date: 2019-11-22 03:12:53 UTC
  • Revision ID: git-v1:d7d49eb1d5a7d30c3415b6b569f7b5e1e2a480da
huawei: Fix infinite loop on modem removal

After unplugging a Huawei USB dongle, the 'atoms' in oFono are removed
via 'flush_atoms'.  Every atom has a destruct function pointer, used as
destructor.  This includes the gprs_context atom that is currently
active.

The function calls are:
flush_atoms -> destruct -> gprs_context_remove ->
at_gprs_context_remove -> modem_disconnect

Because the device is physically removed, the IO channel for the AT
port is gone.  In 'at_gprs_context_remove', there is an attempt to
resume communication over that AT port, but that is not possible. This
is detected, and 'io_disconnect' (pointer to 'modem_disconnect') is
called. 'modem_disconnect' has the same atom and tries to remove it
again, so it calls the same destructor.  This continues infinitely.

This patch moves the GPRS context removal so that it only happens if the
modem port could be re-opened successfully.  If the port cannot be
re-opened (in the case of modem removal), the atom is already in the
process of being removed by the process kicked off in flush_atoms.

This fix is limited to Huawei devices and has been tested using the
following devices:

- E3531i-2
- E3372
- E3531s-2
- E369
- E1552

expand all expand all

Show diffs side-by-side

added added

removed removed

Lines of Context: