diff options
-rw-r--r-- | src/core/namespace.c | 1 | ||||
-rw-r--r-- | src/dissect/dissect.c | 1 | ||||
-rw-r--r-- | src/gpt-auto-generator/gpt-auto-generator.c | 1 | ||||
-rw-r--r-- | src/nspawn/nspawn.c | 1 | ||||
-rw-r--r-- | src/portable/portable.c | 1 | ||||
-rw-r--r-- | src/shared/discover-image.c | 4 | ||||
-rw-r--r-- | src/shared/dissect-image.c | 29 | ||||
-rw-r--r-- | src/shared/dissect-image.h | 4 | ||||
-rw-r--r-- | src/sysext/sysext.c | 1 | ||||
-rw-r--r-- | src/test/test-loop-block.c | 6 |
10 files changed, 39 insertions, 10 deletions
diff --git a/src/core/namespace.c b/src/core/namespace.c index 9f9d47d34a..bffcb5ac86 100644 --- a/src/core/namespace.c +++ b/src/core/namespace.c @@ -1863,6 +1863,7 @@ int setup_namespace( loop_device->fd, &verity, root_image_options, + loop_device->uevent_seqnum_not_before, dissect_image_flags, &dissected_image); if (r < 0) diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index c21d3e47e4..d70f1e791f 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -781,6 +781,7 @@ static int run(int argc, char *argv[]) { arg_image, &arg_verity_settings, NULL, + d->uevent_seqnum_not_before, arg_flags, &m); if (r < 0) diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index 42549a2cd8..eb80165bbe 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -672,6 +672,7 @@ static int enumerate_partitions(dev_t devnum) { r = dissect_image( fd, NULL, NULL, + UINT64_MAX, DISSECT_IMAGE_GPT_ONLY| DISSECT_IMAGE_NO_UDEV| DISSECT_IMAGE_USR_NO_ROOT, diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 164a330207..0701602418 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5483,6 +5483,7 @@ static int run(int argc, char *argv[]) { arg_image, &arg_verity_settings, NULL, + loop->uevent_seqnum_not_before, dissect_image_flags, &dissected_image); if (r == -ENOPKG) { diff --git a/src/portable/portable.c b/src/portable/portable.c index e2bce27947..28d884a951 100644 --- a/src/portable/portable.c +++ b/src/portable/portable.c @@ -395,6 +395,7 @@ static int portable_extract_by_path( r = dissect_image( d->fd, NULL, NULL, + d->uevent_seqnum_not_before, DISSECT_IMAGE_READ_ONLY | DISSECT_IMAGE_GENERIC_ROOT | DISSECT_IMAGE_REQUIRE_ROOT | diff --git a/src/shared/discover-image.c b/src/shared/discover-image.c index 43138e0a6f..c343d08931 100644 --- a/src/shared/discover-image.c +++ b/src/shared/discover-image.c @@ -1201,10 +1201,12 @@ int image_read_metadata(Image *i) { r = dissect_image( d->fd, NULL, NULL, + d->uevent_seqnum_not_before, DISSECT_IMAGE_GENERIC_ROOT | DISSECT_IMAGE_REQUIRE_ROOT | DISSECT_IMAGE_RELAX_VAR_CHECK | - DISSECT_IMAGE_USR_NO_ROOT, &m); + DISSECT_IMAGE_USR_NO_ROOT, + &m); if (r < 0) return r; diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index f6971038de..345e1db9a7 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -260,6 +260,7 @@ struct wait_data { sd_device *parent_device; blkid_partition blkidp; sd_device *found; + uint64_t uevent_seqnum_not_before; }; static inline void wait_data_done(struct wait_data *d) { @@ -275,6 +276,20 @@ static int device_monitor_handler(sd_device_monitor *monitor, sd_device *device, if (device_for_action(device, SD_DEVICE_REMOVE)) return 0; + if (w->uevent_seqnum_not_before != UINT64_MAX) { + uint64_t seqnum; + + r = sd_device_get_seqnum(device, &seqnum); + if (r < 0) + goto finish; + + if (seqnum <= w->uevent_seqnum_not_before) { /* From an older use of this loop device */ + log_debug("Dropping event because seqnum too old (%" PRIu64 " <= %" PRIu64 ")", + seqnum, w->uevent_seqnum_not_before); + return 0; + } + } + r = device_is_partition(device, w->parent_device, w->blkidp); if (r < 0) goto finish; @@ -294,6 +309,7 @@ static int wait_for_partition_device( sd_device *parent, blkid_partition pp, usec_t deadline, + uint64_t uevent_seqnum_not_before, sd_device **ret) { _cleanup_(sd_event_source_unrefp) sd_event_source *timeout_source = NULL; @@ -336,6 +352,7 @@ static int wait_for_partition_device( _cleanup_(wait_data_done) struct wait_data w = { .parent_device = parent, .blkidp = pp, + .uevent_seqnum_not_before = uevent_seqnum_not_before, }; r = sd_device_monitor_start(monitor, device_monitor_handler, &w); @@ -492,6 +509,7 @@ int dissect_image( int fd, const VeritySettings *verity, const MountOptions *mount_options, + uint64_t uevent_seqnum_not_before, DissectImageFlags flags, DissectedImage **ret) { @@ -744,7 +762,7 @@ int dissect_image( if (!pp) return errno_or_else(EIO); - r = wait_for_partition_device(d, pp, deadline, &q); + r = wait_for_partition_device(d, pp, deadline, uevent_seqnum_not_before, &q); if (r < 0) return r; @@ -2579,6 +2597,7 @@ int dissect_image_and_warn( const char *name, const VeritySettings *verity, const MountOptions *mount_options, + uint64_t uevent_seqnum_not_before, DissectImageFlags flags, DissectedImage **ret) { @@ -2593,7 +2612,7 @@ int dissect_image_and_warn( name = buffer; } - r = dissect_image(fd, verity, mount_options, flags, ret); + r = dissect_image(fd, verity, mount_options, uevent_seqnum_not_before, flags, ret); switch (r) { case -EOPNOTSUPP: @@ -2701,7 +2720,7 @@ int mount_image_privately_interactively( if (r < 0) return log_error_errno(r, "Failed to set up loopback device: %m"); - r = dissect_image_and_warn(d->fd, image, &verity, NULL, flags, &dissected_image); + r = dissect_image_and_warn(d->fd, image, &verity, NULL, d->uevent_seqnum_not_before, flags, &dissected_image); if (r < 0) return r; @@ -2792,6 +2811,7 @@ int verity_dissect_and_mount( loop_device->fd, &verity, options, + loop_device->uevent_seqnum_not_before, dissect_image_flags, &dissected_image); /* No partition table? Might be a single-filesystem image, try again */ @@ -2800,7 +2820,8 @@ int verity_dissect_and_mount( loop_device->fd, &verity, options, - dissect_image_flags|DISSECT_IMAGE_NO_PARTITION_TABLE, + loop_device->uevent_seqnum_not_before, + dissect_image_flags | DISSECT_IMAGE_NO_PARTITION_TABLE, &dissected_image); if (r < 0) return log_debug_errno(r, "Failed to dissect image: %m"); diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index d51049e78a..5d0b1d5e65 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -159,8 +159,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(MountOptions*, mount_options_free_all); const char* mount_options_from_designator(const MountOptions *options, PartitionDesignator designator); int probe_filesystem(const char *node, char **ret_fstype); -int dissect_image(int fd, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); -int dissect_image_and_warn(int fd, const char *name, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); +int dissect_image(int fd, const VeritySettings *verity, const MountOptions *mount_options, uint64_t uevent_seqnum_not_before, DissectImageFlags flags, DissectedImage **ret); +int dissect_image_and_warn(int fd, const char *name, const VeritySettings *verity, const MountOptions *mount_options, uint64_t uevent_seqnum_not_before, DissectImageFlags flags, DissectedImage **ret); DissectedImage* dissected_image_unref(DissectedImage *m); DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref); diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index 49ec23d934..c305a30fae 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -532,6 +532,7 @@ static int merge_subprocess(Hashmap *images, const char *workspace) { img->path, &verity_settings, NULL, + d->uevent_seqnum_not_before, flags, &m); if (r < 0) diff --git a/src/test/test-loop-block.c b/src/test/test-loop-block.c index 93f2da70e7..cfa999eff7 100644 --- a/src/test/test-loop-block.c +++ b/src/test/test-loop-block.c @@ -51,7 +51,7 @@ static void* thread_func(void *ptr) { log_notice("Acquired loop device %s, will mount on %s", loop->node, mounted); - r = dissect_image(loop->fd, NULL, NULL, DISSECT_IMAGE_READ_ONLY, &dissected); + r = dissect_image(loop->fd, NULL, NULL, loop->uevent_seqnum_not_before, DISSECT_IMAGE_READ_ONLY, &dissected); if (r < 0) log_error_errno(r, "Failed dissect loopback device %s: %m", loop->node); assert_se(r >= 0); @@ -188,7 +188,7 @@ int main(int argc, char *argv[]) { sfdisk = NULL; assert_se(loop_device_make(fd, O_RDWR, 0, UINT64_MAX, LO_FLAGS_PARTSCAN, &loop) >= 0); - assert_se(dissect_image(loop->fd, NULL, NULL, 0, &dissected) >= 0); + assert_se(dissect_image(loop->fd, NULL, NULL, loop->uevent_seqnum_not_before, 0, &dissected) >= 0); assert_se(dissected->partitions[PARTITION_ESP].found); assert_se(dissected->partitions[PARTITION_ESP].node); @@ -212,7 +212,7 @@ int main(int argc, char *argv[]) { assert_se(make_filesystem(dissected->partitions[PARTITION_HOME].node, "ext4", "home", id, true) >= 0); dissected = dissected_image_unref(dissected); - assert_se(dissect_image(loop->fd, NULL, NULL, 0, &dissected) >= 0); + assert_se(dissect_image(loop->fd, NULL, NULL, loop->uevent_seqnum_not_before, 0, &dissected) >= 0); assert_se(mkdtemp_malloc(NULL, &mounted) >= 0); |