From 80dd1125c86252c774b1becb4aeb5513c54ef57d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 15 Sep 2020 17:53:32 +0200 Subject: [PATCH 1/4] test: remove test-dissect-image It does pretty much exactly what systemd-dissect does and is a manual test, hence let's remove it as redundant code. --- src/test/meson.build | 5 ---- src/test/test-dissect-image.c | 51 ----------------------------------- 2 files changed, 56 deletions(-) delete mode 100644 src/test/test-dissect-image.c diff --git a/src/test/meson.build b/src/test/meson.build index 70450ea1c5..7eb343116a 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -421,11 +421,6 @@ tests += [ [], '', 'manual'], - [['src/test/test-dissect-image.c'], - [], - [libblkid], - '', 'manual'], - [['src/test/test-signal-util.c'], [], []], diff --git a/src/test/test-dissect-image.c b/src/test/test-dissect-image.c deleted file mode 100644 index fe78216b78..0000000000 --- a/src/test/test-dissect-image.c +++ /dev/null @@ -1,51 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1+ */ - -#include -#include -#include - -#include "dissect-image.h" -#include "log.h" -#include "loop-util.h" -#include "string-util.h" -#include "tests.h" - -int main(int argc, char *argv[]) { - _cleanup_(loop_device_unrefp) LoopDevice *d = NULL; - _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL; - int r, i; - - test_setup_logging(LOG_DEBUG); - - if (argc < 2) { - log_error("Requires one command line argument."); - return EXIT_FAILURE; - } - - r = loop_device_make_by_path(argv[1], O_RDONLY, LO_FLAGS_PARTSCAN, &d); - if (r < 0) { - log_error_errno(r, "Failed to set up loopback device: %m"); - return EXIT_FAILURE; - } - - r = dissect_image(d->fd, NULL, 0, NULL, NULL, DISSECT_IMAGE_REQUIRE_ROOT|DISSECT_IMAGE_RELAX_VAR_CHECK, &m); - if (r < 0) { - log_error_errno(r, "Failed to dissect image: %m"); - return EXIT_FAILURE; - } - - for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { - - if (!m->partitions[i].found) - continue; - - printf("Found %s partition, %s of type %s at #%i (%s)\n", - partition_designator_to_string(i), - m->partitions[i].rw ? "writable" : "read-only", - strna(m->partitions[i].fstype), - m->partitions[i].partno, - strna(m->partitions[i].node)); - } - - return EXIT_SUCCESS; -} From f5215bc8d386bcc995942f7eedc1343a51e9f82f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 15 Sep 2020 18:02:28 +0200 Subject: [PATCH 2/4] =?UTF-8?q?dissect:=20rename=20mount=5Foptions=5Ffrom?= =?UTF-8?q?=5Fpart()=20=E2=86=92=20mount=5Foptions=5Ffrom=5Fdesignator()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After all, it actually takes a designator argument, not a partition index or so. --- src/shared/dissect-image.c | 14 +++++++------- src/shared/dissect-image.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 15c3f55de0..385b1247d7 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -420,7 +420,7 @@ int dissect_image( m->verity = root_hash && verity_data; m->can_verity = !!verity_data; - options = mount_options_from_part(mount_options, PARTITION_ROOT); + options = mount_options_from_designator(mount_options, PARTITION_ROOT); if (options) { o = strdup(options); if (!o) @@ -716,7 +716,7 @@ int dissect_image( if (!n) return -ENOMEM; - options = mount_options_from_part(mount_options, designator); + options = mount_options_from_designator(mount_options, designator); if (options) { o = strdup(options); if (!o) @@ -773,7 +773,7 @@ int dissect_image( if (!n) return -ENOMEM; - options = mount_options_from_part(mount_options, PARTITION_XBOOTLDR); + options = mount_options_from_designator(mount_options, PARTITION_XBOOTLDR); if (options) { o = strdup(options); if (!o) @@ -827,7 +827,7 @@ int dissect_image( if (multiple_generic) return -ENOTUNIQ; - options = mount_options_from_part(mount_options, PARTITION_ROOT); + options = mount_options_from_designator(mount_options, PARTITION_ROOT); if (options) { o = strdup(options); if (!o) @@ -2068,10 +2068,10 @@ MountOptions* mount_options_free_all(MountOptions *options) { return NULL; } -const char* mount_options_from_part(const MountOptions *options, int designator) { - MountOptions *m; +const char* mount_options_from_designator(const MountOptions *options, int designator) { + const MountOptions *m; - LIST_FOREACH(mount_options, m, (MountOptions *)options) + LIST_FOREACH(mount_options, m, options) if (designator == m->partition_designator && !isempty(m->options)) return m->options; diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index 96f9840400..9666488c27 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -94,7 +94,7 @@ struct MountOptions { MountOptions* mount_options_free_all(MountOptions *options); DEFINE_TRIVIAL_CLEANUP_FUNC(MountOptions*, mount_options_free_all); -const char* mount_options_from_part(const MountOptions *options, int designator); +const char* mount_options_from_designator(const MountOptions *options, int designator); int probe_filesystem(const char *node, char **ret_fstype); int dissect_image(int fd, const void *root_hash, size_t root_hash_size, const char *verity_data, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); From 569a0e42ec758aa63907be96f671cc84952da0f2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 15 Sep 2020 18:02:28 +0200 Subject: [PATCH 3/4] dissect: introduce PartitionDesignator as real type --- src/core/dbus-execute.c | 2 +- src/core/load-fragment.c | 4 ++-- src/dissect/dissect.c | 2 +- src/shared/dissect-image.c | 21 +++++++++------------ src/shared/dissect-image.h | 18 +++++++++--------- 5 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index 8f915ac2f5..445230d27c 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -1460,7 +1460,7 @@ static int read_mount_options(sd_bus_message *message, sd_bus_error *error, Moun while ((r = sd_bus_message_read(message, "(ss)", &partition, &mount_options)) > 0) { _cleanup_free_ char *previous = NULL, *escaped = NULL; _cleanup_free_ MountOptions *o = NULL; - int partition_designator; + PartitionDesignator partition_designator; if (chars_intersect(mount_options, WHITESPACE)) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index d3919adddf..3635ed03fe 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -1483,7 +1483,7 @@ int config_parse_root_image_options( MountOptions *o = NULL; _cleanup_free_ char *mount_options_resolved = NULL; const char *mount_options = NULL, *partition = "root"; - int partition_designator; + PartitionDesignator partition_designator; /* Format is either 'root:foo' or 'foo' (root is implied) */ if (!isempty(*second)) { @@ -4866,7 +4866,7 @@ int config_parse_mount_images( for (;;) { _cleanup_free_ char *partition = NULL, *mount_options = NULL, *mount_options_resolved = NULL; MountOptions *o = NULL; - int partition_designator; + PartitionDesignator partition_designator; r = extract_many_words(&q, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS, &partition, &mount_options, NULL); if (r == -ENOMEM) diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index dcebad8274..239bddc9c7 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -456,7 +456,7 @@ static int action_dissect(DissectedImage *m, LoopDevice *d) { (void) table_set_empty_string(t, "-"); (void) table_set_align_percent(t, table_get_cell(t, 0, 7), 100); - for (unsigned i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { + for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { DissectedPartition *p = m->partitions + i; if (!p->found) diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 385b1247d7..28053130ef 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -325,7 +325,6 @@ int dissect_image( int r, generic_nr; struct stat st; sd_device *q; - unsigned i; assert(fd >= 0); assert(ret); @@ -504,7 +503,8 @@ int dissect_image( continue; if (is_gpt) { - int designator = _PARTITION_DESIGNATOR_INVALID, architecture = _ARCHITECTURE_INVALID; + PartitionDesignator designator = _PARTITION_DESIGNATOR_INVALID; + int architecture = _ARCHITECTURE_INVALID; const char *stype, *sid, *fstype = NULL; sd_id128_t type_id, id; bool rw = true; @@ -866,7 +866,7 @@ int dissect_image( b = NULL; /* Fill in file system types if we don't know them yet. */ - for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { + for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { DissectedPartition *p = m->partitions + i; if (!p->found) @@ -894,12 +894,10 @@ int dissect_image( } DissectedImage* dissected_image_unref(DissectedImage *m) { - unsigned i; - if (!m) return NULL; - for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { + for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { free(m->partitions[i].fstype); free(m->partitions[i].node); free(m->partitions[i].decrypted_fstype); @@ -1557,7 +1555,6 @@ int dissected_image_decrypt( #if HAVE_LIBCRYPTSETUP _cleanup_(decrypted_image_unrefp) DecryptedImage *d = NULL; - unsigned i; int r; #endif @@ -1585,7 +1582,7 @@ int dissected_image_decrypt( if (!d) return -ENOMEM; - for (i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { + for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { DissectedPartition *p = m->partitions + i; int k; @@ -2039,14 +2036,14 @@ int dissect_image_and_warn( } } -bool dissected_image_can_do_verity(const DissectedImage *image, unsigned partition_designator) { +bool dissected_image_can_do_verity(const DissectedImage *image, PartitionDesignator partition_designator) { if (image->single_file_system) return partition_designator == PARTITION_ROOT && image->can_verity; return PARTITION_VERITY_OF(partition_designator) >= 0; } -bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_designator) { +bool dissected_image_has_verity(const DissectedImage *image, PartitionDesignator partition_designator) { int k; if (image->single_file_system) @@ -2068,7 +2065,7 @@ MountOptions* mount_options_free_all(MountOptions *options) { return NULL; } -const char* mount_options_from_designator(const MountOptions *options, int designator) { +const char* mount_options_from_designator(const MountOptions *options, PartitionDesignator designator) { const MountOptions *m; LIST_FOREACH(mount_options, m, options) @@ -2164,4 +2161,4 @@ static const char *const partition_designator_table[] = { [PARTITION_VAR] = "var", }; -DEFINE_STRING_TABLE_LOOKUP(partition_designator, int); +DEFINE_STRING_TABLE_LOOKUP(partition_designator, PartitionDesignator); diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index 9666488c27..520d8ab10e 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -27,7 +27,7 @@ struct DissectedPartition { char *mount_options; }; -enum { +typedef enum PartitionDesignator { PARTITION_ROOT, PARTITION_ROOT_SECONDARY, /* Secondary architecture */ PARTITION_HOME, @@ -41,9 +41,9 @@ enum { PARTITION_VAR, _PARTITION_DESIGNATOR_MAX, _PARTITION_DESIGNATOR_INVALID = -1 -}; +} PartitionDesignator; -static inline int PARTITION_VERITY_OF(int p) { +static inline PartitionDesignator PARTITION_VERITY_OF(PartitionDesignator p) { if (p == PARTITION_ROOT) return PARTITION_ROOT_VERITY; if (p == PARTITION_ROOT_SECONDARY) @@ -87,14 +87,14 @@ struct DissectedImage { }; struct MountOptions { - int partition_designator; + PartitionDesignator partition_designator; char *options; LIST_FIELDS(MountOptions, mount_options); }; MountOptions* mount_options_free_all(MountOptions *options); DEFINE_TRIVIAL_CLEANUP_FUNC(MountOptions*, mount_options_free_all); -const char* mount_options_from_designator(const MountOptions *options, int designator); +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 void *root_hash, size_t root_hash_size, const char *verity_data, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); @@ -114,11 +114,11 @@ DecryptedImage* decrypted_image_unref(DecryptedImage *p); DEFINE_TRIVIAL_CLEANUP_FUNC(DecryptedImage*, decrypted_image_unref); int decrypted_image_relinquish(DecryptedImage *d); -const char* partition_designator_to_string(int i) _const_; -int partition_designator_from_string(const char *name) _pure_; +const char* partition_designator_to_string(PartitionDesignator d) _const_; +PartitionDesignator partition_designator_from_string(const char *name) _pure_; int verity_metadata_load(const char *image, const char *root_hash_path, void **ret_roothash, size_t *ret_roothash_size, char **ret_verity_data, char **ret_roothashsig); -bool dissected_image_can_do_verity(const DissectedImage *image, unsigned partition_designator); -bool dissected_image_has_verity(const DissectedImage *image, unsigned partition_designator); +bool dissected_image_can_do_verity(const DissectedImage *image, PartitionDesignator d); +bool dissected_image_has_verity(const DissectedImage *image, PartitionDesignator d); int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, LoopDevice **ret_loop_device, DecryptedImage **ret_decrypted_image); From aa088f62d1b7231cf0f595779af6b51c09a09a1a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 16 Sep 2020 16:31:00 +0200 Subject: [PATCH 4/4] gpt: move GPT_LINUX_GENERIC definition next to the user GPT partition types No code changes, just some reordering. --- src/shared/gpt.h | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/shared/gpt.h b/src/shared/gpt.h index 26a4e1ea65..30fcb88056 100644 --- a/src/shared/gpt.h +++ b/src/shared/gpt.h @@ -7,26 +7,26 @@ #include "id128-util.h" -/* We only support root disk discovery for x86, x86-64, Itanium and ARM for - * now, since EFI for anything else doesn't really exist, and we only - * care for root partitions on the same disk as the EFI ESP. */ +/* We only support root disk discovery for x86, x86-64, Itanium and ARM for now, since EFI for anything else + * doesn't really exist, and we only care for root partitions on the same disk as the EFI ESP. */ -#define GPT_ROOT_X86 SD_ID128_MAKE(44,47,95,40,f2,97,41,b2,9a,f7,d1,31,d5,f0,45,8a) -#define GPT_ROOT_X86_64 SD_ID128_MAKE(4f,68,bc,e3,e8,cd,4d,b1,96,e7,fb,ca,f9,84,b7,09) -#define GPT_ROOT_ARM SD_ID128_MAKE(69,da,d7,10,2c,e4,4e,3c,b1,6c,21,a1,d4,9a,be,d3) -#define GPT_ROOT_ARM_64 SD_ID128_MAKE(b9,21,b0,45,1d,f0,41,c3,af,44,4c,6f,28,0d,3f,ae) -#define GPT_ROOT_IA64 SD_ID128_MAKE(99,3d,8d,3d,f8,0e,42,25,85,5a,9d,af,8e,d7,ea,97) -#define GPT_ESP SD_ID128_MAKE(c1,2a,73,28,f8,1f,11,d2,ba,4b,00,a0,c9,3e,c9,3b) -#define GPT_XBOOTLDR SD_ID128_MAKE(bc,13,c2,ff,59,e6,42,62,a3,52,b2,75,fd,6f,71,72) -#define GPT_SWAP SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f) -#define GPT_HOME SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15) -#define GPT_SRV SD_ID128_MAKE(3b,8f,84,25,20,e0,4f,3b,90,7f,1a,25,a7,6f,98,e8) -#define GPT_VAR SD_ID128_MAKE(4d,21,b0,16,b5,34,45,c2,a9,fb,5c,16,e0,91,fd,2d) -#define GPT_TMP SD_ID128_MAKE(7e,c6,f5,57,3b,c5,4a,ca,b2,93,16,ef,5d,f6,39,d1) -#define GPT_USER_HOME SD_ID128_MAKE(77,3f,91,ef,66,d4,49,b5,bd,83,d6,83,bf,40,ad,16) +#define GPT_ROOT_X86 SD_ID128_MAKE(44,47,95,40,f2,97,41,b2,9a,f7,d1,31,d5,f0,45,8a) +#define GPT_ROOT_X86_64 SD_ID128_MAKE(4f,68,bc,e3,e8,cd,4d,b1,96,e7,fb,ca,f9,84,b7,09) +#define GPT_ROOT_ARM SD_ID128_MAKE(69,da,d7,10,2c,e4,4e,3c,b1,6c,21,a1,d4,9a,be,d3) +#define GPT_ROOT_ARM_64 SD_ID128_MAKE(b9,21,b0,45,1d,f0,41,c3,af,44,4c,6f,28,0d,3f,ae) +#define GPT_ROOT_IA64 SD_ID128_MAKE(99,3d,8d,3d,f8,0e,42,25,85,5a,9d,af,8e,d7,ea,97) +#define GPT_ESP SD_ID128_MAKE(c1,2a,73,28,f8,1f,11,d2,ba,4b,00,a0,c9,3e,c9,3b) +#define GPT_XBOOTLDR SD_ID128_MAKE(bc,13,c2,ff,59,e6,42,62,a3,52,b2,75,fd,6f,71,72) +#define GPT_SWAP SD_ID128_MAKE(06,57,fd,6d,a4,ab,43,c4,84,e5,09,33,c8,4b,4f,4f) +#define GPT_HOME SD_ID128_MAKE(93,3a,c7,e1,2e,b4,4f,13,b8,44,0e,14,e2,ae,f9,15) +#define GPT_SRV SD_ID128_MAKE(3b,8f,84,25,20,e0,4f,3b,90,7f,1a,25,a7,6f,98,e8) +#define GPT_VAR SD_ID128_MAKE(4d,21,b0,16,b5,34,45,c2,a9,fb,5c,16,e0,91,fd,2d) +#define GPT_TMP SD_ID128_MAKE(7e,c6,f5,57,3b,c5,4a,ca,b2,93,16,ef,5d,f6,39,d1) +#define GPT_USER_HOME SD_ID128_MAKE(77,3f,91,ef,66,d4,49,b5,bd,83,d6,83,bf,40,ad,16) +#define GPT_LINUX_GENERIC SD_ID128_MAKE(0f,c6,3d,af,84,83,47,72,8e,79,3d,69,d8,47,7d,e4) -/* Verity partitions for the root partitions above (we only define them for the root partitions, because only they are - * are commonly read-only and hence suitable for verity). */ +/* Verity partitions for the root partitions above (we only define them for the root partitions, because only + * they are are commonly read-only and hence suitable for verity). */ #define GPT_ROOT_X86_VERITY SD_ID128_MAKE(d1,3c,5d,3b,b5,d1,42,2a,b2,9f,94,54,fd,c8,9d,76) #define GPT_ROOT_X86_64_VERITY SD_ID128_MAKE(2c,73,57,ed,eb,d2,46,d9,ae,c1,23,d4,37,ec,2b,f5) #define GPT_ROOT_ARM_VERITY SD_ID128_MAKE(73,86,cd,f2,20,3c,47,a9,a4,98,f2,ec,ce,45,a2,d6) @@ -62,15 +62,12 @@ #define GPT_FLAG_NO_BLOCK_IO_PROTOCOL (1ULL << 1) #define GPT_FLAG_LEGACY_BIOS_BOOTABLE (1ULL << 2) -/* Flags we recognize on the root, swap, home and srv partitions when - * doing auto-discovery. These happen to be identical to what - * Microsoft defines for its own Basic Data Partitions, but that's - * just because we saw no point in defining any other values here. */ +/* Flags we recognize on the root, swap, home and srv partitions when doing auto-discovery. These happen to + * be identical to what Microsoft defines for its own Basic Data Partitions, but that's just because we saw + * no point in defining any other values here. */ #define GPT_FLAG_READ_ONLY (1ULL << 60) #define GPT_FLAG_NO_AUTO (1ULL << 63) -#define GPT_LINUX_GENERIC SD_ID128_MAKE(0f,c6,3d,af,84,83,47,72,8e,79,3d,69,d8,47,7d,e4) - const char *gpt_partition_type_uuid_to_string(sd_id128_t id); const char *gpt_partition_type_uuid_to_string_harder( sd_id128_t id,