From c67164cf2c6aed29f70a98ef9050503e56aba952 Mon Sep 17 00:00:00 2001 From: Yu Watanabe 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,