dissect: Don't count RPMB and boot partitions (#8609)

Filter-out RPMB partitions and boot partitions from MMC devices when
counting partitions enumerated by the kernel. Also factor out the now
duplicated code into a separate function.

This complement the previous fixes to the problem reported in
https://github.com/systemd/systemd/issues/5806
This commit is contained in:
João Paulo Rechi Vita 2018-04-03 05:51:18 -07:00 committed by Lennart Poettering
parent bd6ae7e6f0
commit cde942f61b

View file

@ -108,6 +108,14 @@ not_found:
#endif #endif
} }
/* Detect RPMB and Boot partitions, which are not listed by blkid.
* See https://github.com/systemd/systemd/issues/5806. */
static bool device_is_mmc_special_partition(struct udev_device *d) {
const char *sysname = udev_device_get_sysname(d);
return (sysname && startswith(sysname, "mmcblk") &&
(endswith(sysname, "rpmb") || endswith(sysname, "boot0") || endswith(sysname, "boot1")));
}
int dissect_image( int dissect_image(
int fd, int fd,
const void *root_hash, const void *root_hash,
@ -282,8 +290,17 @@ int dissect_image(
/* Count the partitions enumerated by the kernel */ /* Count the partitions enumerated by the kernel */
n = 0; n = 0;
first = udev_enumerate_get_list_entry(e); first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) udev_list_entry_foreach(item, first) {
_cleanup_udev_device_unref_ struct udev_device *q;
q = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
if (!q)
return -errno;
if (device_is_mmc_special_partition(q))
continue;
n++; n++;
}
/* Count the partitions enumerated by blkid */ /* Count the partitions enumerated by blkid */
z = blkid_partlist_numof_partitions(pl); z = blkid_partlist_numof_partitions(pl);
@ -342,7 +359,7 @@ int dissect_image(
_cleanup_udev_device_unref_ struct udev_device *q; _cleanup_udev_device_unref_ struct udev_device *q;
unsigned long long pflags; unsigned long long pflags;
blkid_partition pp; blkid_partition pp;
const char *node, *sysname; const char *node;
dev_t qn; dev_t qn;
int nr; int nr;
@ -357,11 +374,7 @@ int dissect_image(
if (st.st_rdev == qn) if (st.st_rdev == qn)
continue; continue;
/* Filter out weird MMC RPMB partitions, which cannot reasonably be read, see if (device_is_mmc_special_partition(q))
* https://github.com/systemd/systemd/issues/5806 */
sysname = udev_device_get_sysname(q);
if (sysname && startswith(sysname, "mmcblk") &&
(endswith(sysname, "rpmb") || endswith(sysname, "boot0" ) || endswith(sysname, "boot1")))
continue; continue;
node = udev_device_get_devnode(q); node = udev_device_get_devnode(q);