Commit Graph
3174 Commits
Author SHA1 Message Date
Aleksander Morgado f270a09cb2 filter: allow enabling/disabling rules via envvars
E.g. forcing a MBIM modem to run in AT-only mode:

  # MM_FILTER_RULE_NET=0     \
    MM_FILTER_RULE_CDC_WDM=0 \
    /usr/sbin/ModemManager --debug

This is just for quick testing for now.
2017-12-05 10:58:29 +01:00
Aleksander Morgado 239f7ba8a2 filter: remove bogus TTY virtual console filter
The more generic filter for virtual devices already covers all cases
covered by the TTY virtual console filter.
2017-12-05 10:58:28 +01:00
Aleksander Morgado 4e26661e67 filter: new object to run the port/device filter logic
This new object allows configuring the filter rules applied to the
device ports. By default, for now, it implements the same rules as the
MMKernelDevice is_candidate() method, which is obsoleted.
2017-12-05 10:58:28 +01:00
Aleksander Morgado d04f98d966 kerneldevice: consolidate candidate rules in the base device
This patch implicitly enables in the generic device backend the
manual-only greylist (ID_MM_DEVICE_MANUAL_SCAN_ONLY tag) and the
platform TTY whitelist (ID_MM_PLATFORM_DRIVER_PROBE), which were not
being applied.
2017-12-05 10:58:28 +01:00
Aleksander Morgado 345d9747a7 kerneldevice: allow loading physdev sysfs path 2017-12-05 10:58:28 +01:00
Aleksander Morgado 0e4e4a6b13 kerneldevice: allow loading physdev subsystem
Used to filter out TTYs when not explicitly whitelisted.
2017-12-05 10:58:28 +01:00
Aleksander Morgado 7119b8ebb2 bearer-qmi: new optional connection status monitoring
This update makes it possible to request connection status polling for
QMI modems via the ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE tag.

If not given, the connection status polling will be disabled by
default, and the QMI modem will rely on WDS indications only.
2017-11-23 14:20:39 +01:00
Aleksander Morgado d20d46a629 iface-modem: remove invalid modem reference count in update_lock_info()
The modem object is being explicitly referenced and stored in the
Context, but then never unref-ed, completely leaking a modem reference
forever.

Fixes: 4df5458847
2017-11-23 14:20:38 +01:00
Aleksander Morgado de334b7777 broadband-modem-qmi: plug memleak when listing stored images
==24602== 288 bytes in 4 blocks are definitely lost in loss record 4,693 of 4,860
==24602==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24602==    by 0x67292F9: g_malloc (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x670A706: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x670B849: g_slice_alloc0 (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x53D3A24: __qmi_message_dms_get_stored_image_info_response_parse (qmi-dms.c:22779)
==24602==    by 0x53E5C61: get_stored_image_info_ready (qmi-dms.c:32287)
==24602==    by 0x6134908: g_simple_async_result_complete (in /usr/lib/libgio-2.0.so.0.5400.0)
==24602==    by 0x613499E: ??? (in /usr/lib/libgio-2.0.so.0.5400.0)
==24602==    by 0x67180BD: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x6719F68: ??? (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x671AF41: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.5400.0)
==24602==    by 0x14477B: main (main.c:180)
2017-11-23 13:02:42 +01:00
Luis A. Lozano 71f0fc6821 sms-cdma-part: fix tautological-constant-compare compiler warning
This patch fixes the following compiler warning issued by clang:

  mm-sms-part-cdma.c:301:46: mcomparison 'guint8' (aka 'unsigned char') <= 255 is always true
  [-Werror,-Wtautological-constant-compare]
2017-10-26 09:29:20 +02:00
Eric Caruso 098c4c0271 mm-broadband-modem-qmi: reprobe on qmi-proxy death
This allows us to reprobe the modem and respawn the
qmi-proxy in case it dies on us. This gets us access
to the modem and unsolicited notifications again. Do
this by connecting to the device-removed signal on
QmiDevice.

---
Rebased on top of git master by
Aleksander Morgado <aleksander@aleksander.es>
2017-10-22 11:53:32 +02:00
Aleksander Morgado adcce66dd7 broadband-modem-qmi: avoid NULL success return in firmware_load_current
Instead of assuming that NULL is a valid return, make sure we return
an error instead.

This also makes it sure that if the GTask gets cancelled, the result
we set is always a valid GObject, so that the g_object_unref passed as
GDestroyNotify can be safely called always. Not a big deal anyway, as
the GTask cannot be currently cancelled.
2017-10-20 17:56:36 +02:00
Aleksander Morgado dbb4597e33 broadband-modem-qmi: avoid NULL success return in firmware_load_list
Instead of assuming that NULL is a valid return, make sure we return
an error instead.
2017-10-20 17:56:36 +02:00
Aleksander Morgado 6044118b64 broadband-modem-qmi: make it explicit that the GTask is successful
When load_supported_storages() doesn't run the parent implementation,
the GTask is always successful. Make it explicit, in case the logic
changes in the future.
2017-10-20 17:56:29 +02:00
Ben Chan 4e3bf7524d broadband-modem-qmi: port modem_cdma_load_meid to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan f5270ac5ae broadband-modem-qmi: port modem_cdma_load_esn to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 607dee3a95 broadband-modem-qmi: port modem_3gpp_load_operator_code to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan e365cf531c broadband-modem-qmi: port modem_3gpp_load_operator_name to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 942a3565e2 broadband-modem-qmi: port modem_3gpp_load_imei to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan be1b3add84 broadband-modem-qmi: port modem_messaging_setup_sms_format to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 9b27a8bd9a broadband-modem-qmi: port modem_load_supported_ip_families to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 0b942a6759 broadband-modem-qmi: port modem_load_supported_ip_modes to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan bba2386238 broadband-modem-qmi: port modem_load_device_identifier to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 55c3e162b1 broadband-modem-qmi: port modem_load_unlock_required to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 2ba17be8b6 broadband-modem-qmi: port modem_create_bearer to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 2aaac123ac broadband-modem-qmi: port messaging_load_supported_storages to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan bf9e5cdfeb broadband-modem-qmi: port messaging_check_support to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 30dfe3055e broadband-modem-qmi: port signal_check_support to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan e9ee49d583 broadband-modem-qmi: port oma_check_support to use GTask 2017-10-20 17:20:24 +02:00
Ben Chan 3e91956d0c broadband-modem-qmi: port location_load_capabilities to use GTask 2017-10-20 17:20:23 +02:00
Ben Chan d99398b055 broadband-modem-qmi: port enable_location_gathering to use GTask 2017-10-20 17:20:23 +02:00
Ben Chan 07d922e250 broadband-modem-qmi: port firmware_load_list to use GTask 2017-10-20 17:20:23 +02:00
Ben Chan af2f87d2f2 broadband-modem-qmi: port firmware_load_current to use GTask 2017-10-20 17:20:23 +02:00
Ben Chan 02fadb6e91 broadband-modem-qmi: port enabling_started to use GTask 2017-10-20 17:20:23 +02:00
Ben Chan b412ddc8b9 broadband-modem-qmi: port initialization_started to use GTask 2017-10-20 17:20:23 +02:00
Aleksander Morgado 689dad9f6e base-bearer: fix reporting tx/rx stats
The numbers were actually swapped!
2017-10-19 11:43:50 +02:00
Aleksander Morgado fc40c059fa broadband-modem-mbim: plug memleak when querying previous unlock retries
==15673== 240 (40 direct, 200 indirect) bytes in 1 blocks are definitely lost in loss record 4,341 of 4,535
    ==15673==    at 0x647F014: g_type_create_instance (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==15673==    by 0x6460027: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==15673==    by 0x6461A54: g_object_newv (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==15673==    by 0x6462213: g_object_new (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==15673==    by 0x4E97C33: mm_unlock_retries_new (mm-unlock-retries.c:217)
    ==15673==    by 0x4E97A6F: mm_unlock_retries_new_from_dictionary (mm-unlock-retries.c:171)
    ==15673==    by 0x170B09: mm_iface_modem_get_unlock_retries (mm-iface-modem.c:2942)
    ==15673==    by 0x1DB0A4: pin_query_unlock_retries_ready (mm-broadband-modem-mbim.c:782)
    ==15673==    by 0x613AD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==15673==    by 0x613B775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==15673==    by 0x57D525D: transaction_task_complete_and_free (mbim-device.c:246)
    ==15673==    by 0x57D6086: process_message (mbim-device.c:666)
2017-10-08 10:27:12 +02:00
Aleksander Morgado 58e6f652a1 base-modem: plug memleaks when building port lists
The mm_base_modem_find_ports() method builds a list of full
references, so we need to unref them in the peek() methods.

    ==10047== 14,959 (24 direct, 14,935 indirect) bytes in 1 blocks are definitely lost in loss record 5,470 of 5,473
    ==10047==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==10047==    by 0x66E3028: g_malloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==10047==    by 0x66FAB25: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==10047==    by 0x66D9A33: g_list_append (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==10047==    by 0x15F6A7: mm_base_modem_find_ports (mm-base-modem.c:845)
    ==10047==    by 0x15E9F3: mm_base_modem_peek_port_qmi_for_data (mm-base-modem.c:579)
    ==10047==    by 0x15E8FC: mm_base_modem_get_port_qmi_for_data (mm-base-modem.c:555)
    ==10047==    by 0x1BB99F: _connect (mm-bearer-qmi.c:1391)
    ==10047==    by 0x1540B4: mm_base_bearer_connect (mm-base-bearer.c:841)
    ==10047==    by 0x181F4F: connection_step (mm-iface-modem-simple.c:597)
    ==10047==    by 0x181321: create_bearer_ready (mm-iface-modem-simple.c:258)
    ==10047==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
2017-10-07 14:10:12 +02:00
Ben Chan f8a375b1fa broadband-modem-mbim: use device manufacturer information when available
MBIM modems can be supported by the 'generic' plugin. Instead of
treating the plugin name (i.e. Generic) as the manufacturer, it's more
useful to use the manufacturer information reported by the underlying
USB device if that is available.
2017-10-07 10:05:40 +02:00
Ben Chan 3a0d658b5d kerneldevice: add method to retrieve manufacturer information
A USB device may report its manufacturer through the Manufacturer String
Descriptor. That information can sometimes be useful, e.g. MBIM doesn't
define a standard command to query the manufacturer. This patch adds a
method to MMKernelDevice to retrieve the manufacturer information from
the underlying physical device, which can later be used by
MMBroadbandModemMbim to report the manufacturer of a MBIM modem.
2017-10-07 10:05:40 +02:00
Aleksander Morgado efaa780de2 port-qmi: don't allow client allocation if port is closed
The internal QmiDevice will be gone when the port is closed, so we
cannot really do anything.

This avoid an issue happening when the modem goes away in the middle
of the client allocation logic performed by MMBroadbandModemQmi:

    ModemManager[24820]: <debug> [1507279407.225777] Couldn't allocate client for service 'wms': Couldn't create client for service 'wms': CID allocation failed in the CTL client: Transaction timed out
    ModemManager[24820]: qmi_device_allocate_client: assertion 'QMI_IS_DEVICE (self)' failed
    ==24820==
    ==24820== Process terminating with default action of signal 5 (SIGTRAP): dumping core
    ==24820==    at 0x66E3411: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==24820==    by 0x66E46FA: g_logv (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==24820==    by 0x66E484E: g_log (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==24820==    by 0x538E259: qmi_device_allocate_client (qmi-device.c:1008)
    ==24820==    by 0x1F5690: mm_port_qmi_allocate_client (mm-port-qmi.c:157)
    ==24820==    by 0x1D20BA: allocate_next_client (mm-broadband-modem-qmi.c:11319)
    ==24820==    by 0x1D2027: qmi_port_allocate_client_ready (mm-broadband-modem-qmi.c:11306)
    ==24820==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==24820==    by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==24820==    by 0x1F54E8: allocate_client_ready (mm-port-qmi.c:113)
    ==24820==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==24820==    by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
2017-10-06 10:51:01 +02:00
Aleksander Morgado 4bd15362c5 kerneldevice,generic: plug memleak
==5075== 198 bytes in 18 blocks are definitely lost in loss record 4,486 of 4,761
    ==5075==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==5075==    by 0x66E3028: g_malloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==5075==    by 0x66CAD42: g_path_get_basename (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==5075==    by 0x20BB7B: preload_interface_sysfs_path (mm-kernel-device-generic.c:184)
    ==5075==    by 0x20C885: preload_contents (mm-kernel-device-generic.c:383)
    ==5075==    by 0x20E2E1: check_preload (mm-kernel-device-generic.c:830)
    ==5075==    by 0x20EA6F: set_property (mm-kernel-device-generic.c:953)
    ==5075==    by 0x6455359: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==5075==    by 0x6456DBC: g_object_new_valist (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==5075==    by 0x6105E95: g_initable_new_valist (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==5075==    by 0x6105F58: g_initable_new (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==5075==    by 0x20E848: mm_kernel_device_generic_new_with_rules (mm-kernel-device-generic.c:901)
2017-10-05 23:46:42 +02:00
Aleksander Morgado 8cd21e439d kerneldevice,generic: plug memleak
==5075== 333 bytes in 37 blocks are definitely lost in loss record 4,612 of 4,761
    ==5075==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==5075==    by 0x66E3028: g_malloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==5075==    by 0x66CAD42: g_path_get_basename (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==5075==    by 0x20BE20: preload_driver (mm-kernel-device-generic.c:242)
    ==5075==    by 0x20C8E5: preload_contents (mm-kernel-device-generic.c:391)
    ==5075==    by 0x20E2E1: check_preload (mm-kernel-device-generic.c:830)
    ==5075==    by 0x20EA6F: set_property (mm-kernel-device-generic.c:953)
    ==5075==    by 0x6455359: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==5075==    by 0x6456DBC: g_object_new_valist (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==5075==    by 0x6105E95: g_initable_new_valist (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==5075==    by 0x6105F58: g_initable_new (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==5075==    by 0x20E848: mm_kernel_device_generic_new_with_rules (mm-kernel-device-generic.c:901)
2017-10-05 23:46:42 +02:00
Aleksander Morgado 2dc13fd964 plugin-manager: allow multiple calls to port_context_complete()
Only the first one will work.
2017-10-05 23:46:42 +02:00
Aleksander Morgado bbe5064591 plugin-manager: ensure valid reference during cancellation
Cancelling the port_context->cancellable may end up finishing the
async task and completing the last reference of the port
context. Avoid that by making sure we hold a valid reference for as
long as we may need it.

    ==2277== Invalid read of size 4
    ==2277==    at 0x14ACE2: port_context_cancel (mm-plugin-manager.c:547)
    ==2277==    by 0x14C32E: device_context_port_released (mm-plugin-manager.c:1142)
    ==2277==    by 0x83831C7: ffi_call_unix64 (in /usr/lib/libffi.so.6.0.4)
    ==2277==    by 0x8382C29: ffi_call (in /usr/lib/libffi.so.6.0.4)
    ==2277==    by 0x64506A8: g_cclosure_marshal_generic (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x644FEAC: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x64624AD: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x646AC84: g_signal_emit_valist (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x646B69E: g_signal_emit (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x1483E7: mm_device_release_port (mm-device.c:196)
    ==2277==    by 0x145D5D: device_removed (mm-base-manager.c:217)
    ==2277==    by 0x1464A9: handle_kernel_event (mm-base-manager.c:401)
    ==2277==  Address 0xf677d18 is 88 bytes inside a block of size 96 free'd
    ==2277==    at 0x4C2E14B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==2277==    by 0x14A1B7: port_context_unref (mm-plugin-manager.c:234)
    ==2277==    by 0x14AB51: plugin_supports_port_ready (mm-plugin-manager.c:492)
    ==2277==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==    by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==    by 0x1AFDF8: port_probe_run_ready (mm-plugin.c:624)
    ==2277==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==    by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==    by 0x6131367: g_task_return_error_if_cancelled (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==    by 0x1A9EDA: port_probe_task_return_error_if_cancelled (mm-port-probe.c:109)
    ==2277==    by 0x1ABCD2: serial_probe_at_parse_response (mm-port-probe.c:900)
    ==2277==    by 0x611E475: g_simple_async_result_complete (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==2277==  Block was alloc'd at
    ==2277==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==2277==    by 0x66E3028: g_malloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==2277==    by 0x66FAB25: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==2277==    by 0x66FAFB8: g_slice_alloc0 (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==2277==    by 0x14B18D: port_context_new (mm-plugin-manager.c:649)
    ==2277==    by 0x14C4A7: device_context_port_grabbed (mm-plugin-manager.c:1182)
    ==2277==    by 0x83831C7: ffi_call_unix64 (in /usr/lib/libffi.so.6.0.4)
    ==2277==    by 0x8382C29: ffi_call (in /usr/lib/libffi.so.6.0.4)
    ==2277==    by 0x64506A8: g_cclosure_marshal_generic (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x644FEAC: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x64624AD: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==2277==    by 0x646AC84: g_signal_emit_valist (in /usr/lib/libgobject-2.0.so.0.5200.3)
2017-10-05 23:46:41 +02:00
Aleksander Morgado 48850f21b4 port-serial: avoid invalid memory write on cancellation logic
If the GCancellable is already cancelled when trying to connect a
signal, the callback given will be run right away, and that may end up
completing the async task and removing the last MMPortSerial
reference.

    ==30627== Invalid write of size 8
    ==30627==    at 0x1ED43B: port_serial_queue_process (mm-port-serial.c:812)
    ==30627==    by 0x66DE342: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DD8C4: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DDC87: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DDFA1: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x143F9B: main (main.c:180)
    ==30627==  Address 0xf6f0e98 is 200 bytes inside a block of size 328 free'd
    ==30627==    at 0x4C2E14B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==30627==    by 0x64742B2: g_type_free_instance (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==30627==    by 0x1ED0F2: port_serial_got_response (mm-port-serial.c:704)
    ==30627==    by 0x1ED21B: port_serial_response_wait_cancelled (mm-port-serial.c:757)
    ==30627==    by 0x60E1A81: g_cancellable_connect (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==30627==    by 0x1ED43A: port_serial_queue_process (mm-port-serial.c:812)
    ==30627==    by 0x66DE342: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DD8C4: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DDC87: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DDFA1: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x143F9B: main (main.c:180)
    ==30627==  Block was alloc'd at
    ==30627==    at 0x4C2CE5F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==30627==    by 0x66E3028: g_malloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66FAB25: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66FAFB8: g_slice_alloc0 (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x6473FB5: g_type_create_instance (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==30627==    by 0x6455027: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==30627==    by 0x6456DBC: g_object_new_valist (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==30627==    by 0x6457200: g_object_new (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==30627==    by 0x1F253A: mm_port_serial_at_new (mm-port-serial-at.c:533)
    ==30627==    by 0x1AC7E7: serial_open_at (mm-port-probe.c:1210)
    ==30627==    by 0x66DD8C4: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.5200.3)
    ==30627==    by 0x66DDC87: ??? (in /usr/lib/libglib-2.0.so.0.5200.3)
2017-10-05 23:19:22 +02:00
Aleksander Morgado 54b21292b1 base-manager: plug memleak
==28888== 622 (280 direct, 342 indirect) bytes in 7 blocks are definitely lost in loss record 2,515 of 2,548
    ==28888==    at 0x6474014: g_type_create_instance (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==28888==    by 0x6455027: ??? (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==28888==    by 0x6456A54: g_object_newv (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==28888==    by 0x6457213: g_object_new (in /usr/lib/libgobject-2.0.so.0.5200.3)
    ==28888==    by 0x4E9DD7D: mm_kernel_event_properties_new (mm-kernel-event-properties.c:422)
    ==28888==    by 0x4E9D8BC: mm_kernel_event_properties_new_from_string (mm-kernel-event-properties.c:283)
    ==28888==    by 0x1465D7: process_initial_kernel_events (mm-base-manager.c:555)
    ==28888==    by 0x14679E: mm_base_manager_start (mm-base-manager.c:581)
    ==28888==    by 0x143CF3: name_acquired_cb (main.c:110)
    ==28888==    by 0x616B805: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==28888==    by 0x616BA47: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
    ==28888==    by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3)
2017-10-05 22:59:55 +02:00
Aleksander Morgado 5bb205d351 kerneldevice,generic: avoid segfault when reported device doesn't exist
Could be a user error or a race condition. In any case, we shouldn't
crash.

    ModemManager[19677]: <debug> [1507235472.301934] Kernel event reported:
    ModemManager[19677]: <debug> [1507235472.301944]   action:    add
    ModemManager[19677]: <debug> [1507235472.301953]   subsystem: usbmisc
    ModemManager[19677]: <debug> [1507235472.301962]   name:      cdc-wdm0
    ModemManager[19677]: <debug> [1507235472.301970]   uid:       n/a
    ModemManager[19677]: <debug> [1507235472.301984] (usbmisc/cdc-wdm0) preloading contents and properties...
    ModemManager[19677]: <warn>  [1507235472.302007] Invalid sysfs path read for usbmisc/cdc-wdm0
    ModemManager[19677]: <debug> [1507235472.302017] (usbmisc/cdc-wdm0) interface class: 0x00
    ModemManager[19677]: <debug> [1507235472.302027] (usbmisc/cdc-wdm0) interface subclass: 0x00
    ModemManager[19677]: <debug> [1507235472.302037] (usbmisc/cdc-wdm0) interface protocol: 0x00
    ModemManager[19677]: <debug> [1507235472.302046] (usbmisc/cdc-wdm0) interface number (ID_USB_INTERFACE_NUM): 0x00
    ModemManager[19677]: <debug> [1507235472.302059] (usbmisc/cdc-wdm0) manufacturer: unknown
    ModemManager[19677]: <debug> [1507235472.302069] (usbmisc/cdc-wdm0) product: unknown
    ModemManager[19677]: <debug> [1507235472.302078] (usbmisc/cdc-wdm0) vid: unknown
    ModemManager[19677]: <debug> [1507235472.302088] (usbmisc/cdc-wdm0) pid: unknown

    (ModemManager:19677): GLib-CRITICAL **: g_str_has_prefix: assertion 'str != NULL' failed

    (ModemManager:19677): GLib-CRITICAL **: g_str_has_prefix: assertion 'str != NULL' failed

    (ModemManager:19677): GLib-CRITICAL **: g_str_has_prefix: assertion 'str != NULL' failed

    (ModemManager:19677): GLib-CRITICAL **: g_str_has_prefix: assertion 'str != NULL' failed

    Thread 1 "ModemManager" received signal SIGSEGV, Segmentation fault.
2017-10-05 22:50:11 +02:00
Aleksander Morgado 71730509ee port-probe: avoid deadlock trying to disconnect cancellable
We cannot in any way try to disconnect a GCancellable from within a
cancellation handler, or we'll deadlock.

    Thread 1 (Thread 0x7fe98bf25700 (LWP 12079)):
    #0  0x00007fe98a355f36 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
    #1  0x00007fe98a7f5ac0 in g_cond_wait () from /usr/lib/libglib-2.0.so.0
    #2  0x00007fe98ad14650 in g_cancellable_disconnect () from /usr/lib/libgio-2.0.so.0
    #3  0x000000000045be5d in port_probe_run_context_free ()
    #4  0x00007fe98ad519ed in g_task_finalize () from /usr/lib/libgio-2.0.so.0
    #5  0x00007fe98aaaa7b3 in g_object_unref () from /usr/lib/libgobject-2.0.so.0
    #6  0x000000000045b5f8 in port_probe_task_return_error_if_cancelled ()
    #7  0x000000000045c57d in serial_probe_at_parse_response ()
    #8  0x00007fe98ad42ed2 in g_simple_async_result_complete () from /usr/lib/libgio-2.0.so.0
    #9  0x0000000000485c7d in serial_command_ready ()
    #10 0x00007fe98ad42ed2 in g_simple_async_result_complete () from /usr/lib/libgio-2.0.so.0
    #11 0x0000000000482345 in command_context_complete_and_free ()
    #12 0x0000000000482fa5 in port_serial_got_response ()
    #13 0x00000000004830f5 in port_serial_response_wait_cancelled ()
    #14 0x00007fe98aaa70c5 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
    #15 0x00007fe98aab47ce in signal_emit_unlocked_R () from /usr/lib/libgobject-2.0.so.0
    #16 0x00007fe98aabb595 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
    #17 0x00007fe98aabb662 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
    #18 0x00007fe98ad144c5 in g_cancellable_cancel () from /usr/lib/libgio-2.0.so.0
    #19 0x00007fe98aaa70c5 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
    #20 0x00007fe98aab47ce in signal_emit_unlocked_R () from /usr/lib/libgobject-2.0.so.0
    #21 0x00007fe98aabb595 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
    #22 0x00007fe98aabb662 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
    #23 0x00007fe98ad144c5 in g_cancellable_cancel () from /usr/lib/libgio-2.0.so.0
    #24 0x000000000042e9f6 in port_context_cancel ()
    #25 0x00007fe989b99a4c in ffi_call_unix64 () at ../src/x86/unix64.S:75
    #26 0x00007fe989b994b9 in ffi_call (cif=0x7fffc41dcdb0, fn=0x42ea40 <device_context_port_released>, rvalue=<optimized out>, avalue=0x7fffc41dccd0) at ../src/x86/ffi64.c:492
    #27 0x00007fe98aaa7700 in g_cclosure_marshal_generic () from /usr/lib/libgobject-2.0.so.0
    #28 0x00007fe98aaa70c5 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
    #29 0x00007fe98aab47ce in signal_emit_unlocked_R () from /usr/lib/libgobject-2.0.so.0
    #30 0x00007fe98aabb595 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
    #31 0x00007fe98aabb662 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
    #32 0x000000000042c8f0 in mm_device_release_port ()
    #33 0x000000000042a6cb in device_removed ()
    #34 0x000000000042af94 in handle_kernel_event ()
    #35 0x000000000042b356 in report_kernel_event_auth_ready ()
    #36 0x00007fe98ad51783 in g_task_return_now () from /usr/lib/libgio-2.0.so.0
    #37 0x00007fe98ad517b9 in complete_in_idle_cb () from /usr/lib/libgio-2.0.so.0
    #38 0x00007fe98a7bda5e in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
    #39 0x00007fe98a7bddb8 in g_main_context_iterate.isra () from /usr/lib/libglib-2.0.so.0
    #40 0x00007fe98a7be042 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
    #41 0x0000000000428dc4 in main ()

So, just clear the cancellation id before going on with the handler logic.
2017-10-05 12:37:12 +02:00
Dan Williams 3e15dc15ef bearer-mbim: don't crash when modem doesn't send gateways
When the Ericsson F5321 with firmware R3C11/R4D04 is told to make
an IPv6-only connection, it reports that it has IPv4 configuration
but then returns no actual addresses.  Check both the flags and
actual data before trying to use them.

ModemManager[25850]: <debug> [1506958721.914717] IPv4 configuration available: 'address, gateway, dns, mtu'
ModemManager[25850]: <debug> [1506958721.914731]   IP addresses (0)
ModemManager[25850]: <debug> [1506958721.914741]   DNS addresses (0)
ModemManager[25850]: <debug> [1506958721.914748]   MTU: '0'
ModemManager[25850]: <debug> [1506958721.914758] IPv6 configuration available: 'address, dns, mtu'
ModemManager[25850]: <debug> [1506958721.914767]   IP addresses (1)
ModemManager[25850]: <debug> [1506958721.914852]     IP [0]: 'fe80::39:f622:7d01/64'
ModemManager[25850]: <debug> [1506958721.914866]   DNS addresses (2)
ModemManager[25850]: <debug> [1506958721.914883]     DNS [0]: 'fd00:976a::9'
ModemManager[25850]: <debug> [1506958721.914896]   MTU: '1500'
ModemManager[25850]: <debug> [1506958721.914947] (wwp0s20u1i6): port now connected
2017-10-02 10:49:32 -05:00