125 lines
7.8 KiB
Diff
125 lines
7.8 KiB
Diff
|
From c67164cf2c6aed29f70a98ef9050503e56aba952 Mon Sep 17 00:00:00 2001
|
||
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
||
|
Date: Sun, 13 Nov 2022 19:25:02 +0900
|
||
|
Subject: [PATCH] dissect-image: do not try to close invalid fd
|
||
|
|
||
|
Fixes a bug introduced by f7725647bb41c3398a867f139efe526efe8aa1b3.
|
||
|
|
||
|
Hopefully fixes #25348.
|
||
|
|
||
|
(cherry picked from commit 088377e0920a3785e7926f2ed382810836480ae6)
|
||
|
|
||
|
Related: #2138081
|
||
|
---
|
||
|
src/shared/dissect-image.c | 58 +++++++++++++-------------------------
|
||
|
src/shared/dissect-image.h | 6 ++++
|
||
|
2 files changed, 26 insertions(+), 38 deletions(-)
|
||
|
|
||
|
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
|
||
|
index 2989d31d3c..6a991c877a 100644
|
||
|
--- a/src/shared/dissect-image.c
|
||
|
+++ b/src/shared/dissect-image.c
|
||
|
@@ -1010,19 +1010,13 @@ static int dissect_image(
|
||
|
log_debug("No root partition found of the native architecture, falling back to a root "
|
||
|
"partition of the secondary architecture.");
|
||
|
|
||
|
- m->partitions[PARTITION_ROOT] = m->partitions[PARTITION_ROOT_SECONDARY];
|
||
|
- zero(m->partitions[PARTITION_ROOT_SECONDARY]);
|
||
|
- m->partitions[PARTITION_ROOT_VERITY] = m->partitions[PARTITION_ROOT_SECONDARY_VERITY];
|
||
|
- zero(m->partitions[PARTITION_ROOT_SECONDARY_VERITY]);
|
||
|
- m->partitions[PARTITION_ROOT_VERITY_SIG] = m->partitions[PARTITION_ROOT_SECONDARY_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_ROOT_SECONDARY_VERITY_SIG]);
|
||
|
-
|
||
|
- m->partitions[PARTITION_USR] = m->partitions[PARTITION_USR_SECONDARY];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY] = m->partitions[PARTITION_USR_SECONDARY_VERITY];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY_VERITY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY_SIG] = m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG]);
|
||
|
+ m->partitions[PARTITION_ROOT] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_SECONDARY]);
|
||
|
+ m->partitions[PARTITION_ROOT_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_SECONDARY_VERITY]);
|
||
|
+ m->partitions[PARTITION_ROOT_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_SECONDARY_VERITY_SIG]);
|
||
|
+
|
||
|
+ m->partitions[PARTITION_USR] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY_VERITY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG]);
|
||
|
|
||
|
m->partitions[PARTITION_ROOT_OTHER].found = false;
|
||
|
m->partitions[PARTITION_ROOT_OTHER_VERITY].found = false;
|
||
|
@@ -1044,19 +1038,13 @@ static int dissect_image(
|
||
|
"falling back to a root partition of a non-native architecture (%s).",
|
||
|
architecture_to_string(m->partitions[PARTITION_ROOT_OTHER].architecture));
|
||
|
|
||
|
- m->partitions[PARTITION_ROOT] = m->partitions[PARTITION_ROOT_OTHER];
|
||
|
- zero(m->partitions[PARTITION_ROOT_OTHER]);
|
||
|
- m->partitions[PARTITION_ROOT_VERITY] = m->partitions[PARTITION_ROOT_OTHER_VERITY];
|
||
|
- zero(m->partitions[PARTITION_ROOT_OTHER_VERITY]);
|
||
|
- m->partitions[PARTITION_ROOT_VERITY_SIG] = m->partitions[PARTITION_ROOT_OTHER_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_ROOT_OTHER_VERITY_SIG]);
|
||
|
-
|
||
|
- m->partitions[PARTITION_USR] = m->partitions[PARTITION_USR_OTHER];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER]);
|
||
|
- m->partitions[PARTITION_USR_VERITY] = m->partitions[PARTITION_USR_OTHER_VERITY];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER_VERITY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY_SIG] = m->partitions[PARTITION_USR_OTHER_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER_VERITY_SIG]);
|
||
|
+ m->partitions[PARTITION_ROOT] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_OTHER]);
|
||
|
+ m->partitions[PARTITION_ROOT_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_OTHER_VERITY]);
|
||
|
+ m->partitions[PARTITION_ROOT_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_ROOT_OTHER_VERITY_SIG]);
|
||
|
+
|
||
|
+ m->partitions[PARTITION_USR] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER_VERITY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER_VERITY_SIG]);
|
||
|
}
|
||
|
|
||
|
/* Hmm, we found a signature partition but no Verity data? Something is off. */
|
||
|
@@ -1083,12 +1071,9 @@ static int dissect_image(
|
||
|
"partition of the secondary architecture.");
|
||
|
|
||
|
/* Upgrade secondary arch to primary */
|
||
|
- m->partitions[PARTITION_USR] = m->partitions[PARTITION_USR_SECONDARY];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY] = m->partitions[PARTITION_USR_SECONDARY_VERITY];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY_VERITY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY_SIG] = m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG]);
|
||
|
+ m->partitions[PARTITION_USR] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY_VERITY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_USR_SECONDARY_VERITY_SIG]);
|
||
|
|
||
|
m->partitions[PARTITION_USR_OTHER].found = false;
|
||
|
m->partitions[PARTITION_USR_OTHER_VERITY].found = false;
|
||
|
@@ -1105,12 +1090,9 @@ static int dissect_image(
|
||
|
architecture_to_string(m->partitions[PARTITION_ROOT_OTHER].architecture));
|
||
|
|
||
|
/* Upgrade other arch to primary */
|
||
|
- m->partitions[PARTITION_USR] = m->partitions[PARTITION_USR_OTHER];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER]);
|
||
|
- m->partitions[PARTITION_USR_VERITY] = m->partitions[PARTITION_USR_OTHER_VERITY];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER_VERITY]);
|
||
|
- m->partitions[PARTITION_USR_VERITY_SIG] = m->partitions[PARTITION_USR_OTHER_VERITY_SIG];
|
||
|
- zero(m->partitions[PARTITION_USR_OTHER_VERITY_SIG]);
|
||
|
+ m->partitions[PARTITION_USR] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER_VERITY]);
|
||
|
+ m->partitions[PARTITION_USR_VERITY_SIG] = TAKE_PARTITION(m->partitions[PARTITION_USR_OTHER_VERITY_SIG]);
|
||
|
}
|
||
|
|
||
|
/* Hmm, we found a signature partition but no Verity data? Something is off. */
|
||
|
diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h
|
||
|
index 8007b544e7..f2278c4dfa 100644
|
||
|
--- a/src/shared/dissect-image.h
|
||
|
+++ b/src/shared/dissect-image.h
|
||
|
@@ -40,6 +40,12 @@ struct DissectedPartition {
|
||
|
.architecture = _ARCHITECTURE_INVALID, \
|
||
|
.mount_node_fd = -1, \
|
||
|
})
|
||
|
+#define TAKE_PARTITION(p) \
|
||
|
+ ({ \
|
||
|
+ DissectedPartition *_pp = &(p), _p = *_pp; \
|
||
|
+ *_pp = DISSECTED_PARTITION_NULL; \
|
||
|
+ _p; \
|
||
|
+ })
|
||
|
|
||
|
typedef enum PartitionDesignator {
|
||
|
PARTITION_ROOT,
|