[PATCH 2/3] base-manager: handle NULL physical device more gracefully

Aleksander Morgado aleksander at aleksander.es
Fri Feb 24 20:03:45 UTC 2017


On Fri, Feb 24, 2017 at 8:14 PM, Ben Chan <benchan at chromium.org> wrote:
>> > find_device_by_physdev_uid() expects a non-NULL UID of the physical
>> > device. However, mm_kernel_device_get_physdev_uid() could potentially
>> > return NULL on MMKernelDeviceUdev if find_physical_gudevdevice() in
>> > mm-kernel-device-udev.c fails to find the physical device. When a NULL
>> > physical device UID is passed to find_device_by_physdev_uid() and used
>> > in g_hash_table_lookup(), it leads to a crash in g_str_hash(), which is
>> > a bit obscure.
>> >
>> > This patch updates find_device_by_physdev_uid() to handle the case when
>> > mm_kernel_device_get_physdev_uid() fails to return a valid UID, and also
>> > moves the assertion on non-NULL UID to find_device_by_physdev_uid() in
>> > order to ensure find_device_by_physdev_uid() is properly used by future
>> > callers.
>>
>> I'm not sure I agree with this patch. We do want to enforce non-NULL
>> UIDs, as that UID (it previously was the "physdev sysfs path" but
>> doesn't have to now) is used to group ports of the same device
>> together. If the device exposes a single port and has no parent device
>> per se, the sysfs path of the port itself may be used as UID, as
>> there's no grouping to be done.
>>
>> What we should make sure is that mm_kernel_device_get_physdev_uid()
>> never returns NULL, and so the g_assert() is correctly in place.
>>
>> What do you think about these comments?
>>
>
> If that's the expectation, the g_assert() should be placed inside
> mm_kernel_device_get_physdev_uid () instead of the call sites of
> mm_kernel_device_get_physdev_uid (), which is easier to omit.
>

I agree, yes.

> I can update the patch to move the g_assert () and modify the code to
> provide a fallback value of physdev uid to ensure it's never NULL. WDYT?

Yes, that is a good idea.

Something like this:

 * If user-provided UID via "self->priv->properties", return that one.
 * Otherwise, if user-provided UID via "ID_MM_PHYSDEV_UID", return that one.
 * Otherwise, if physdev is valid, return physdev sysfs path. This
will be the most common case.
 * Otherwise, if self->priv->device is set, return port sysfs path
(kernel_device_get_sysfs_path()).
 * Otherwise, the very unlikely case, just return port name.

This would be the same order applied in the "generic" MMKernelDevice
backend, but here we do require sysfs path of the port as a mandatory
parameter and therefore the last very unlikely case above wouldn't
apply.

What do you think?

-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list