of_get_devicepath code flow is split into two: A) Either the device tree node in question has a direct udev_device associated with it
B) Or we assume it's a partition and lookup udev_device for the parent first, before finding a child udev_device or setting a partition offset within the parent udev_device. Since v2017.03.0, we have had a fallthrough from case A into case B: If we have a udev_device, but it's neither a EEPROMs, MTDs or block device, we just consider it a partition. This is problematic, because this may result in us pointing at a very different device: - backend points at a SD-Card host. Host is enabled, but SD-Card is not inserted, so no block device - case A fails, so it's assumed it's a partition and case B uses parent SoC bus to lookup appropriate device - We fall through into the second device_find_block_device, which will take the first matching block device across the SoC. So we could end up with the eMMC: a completely different device than what was pointed at. Fixes: 929ed64cb42f ("of_get_devicepath: make partition finding more robust") Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de> --- src/libdt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libdt.c b/src/libdt.c index e54d7fb5649d..7b99efe5b2de 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -2492,9 +2492,11 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t } /* - * If we found a device but couldn't classify it above, we fall - * through. + * If we find a udev_device but couldn't classify it above, + * it's an error. Falling through would mean to handle it as a + * partition and could lead us to return an arbitrary sibling device */ + return -ENODEV; } /* -- 2.39.2