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:
parent
bd6ae7e6f0
commit
cde942f61b
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue