From: Yu Watanabe Date: Sun, 11 Sep 2022 14:07:29 +0000 (+0900) Subject: dissect-image: introduce reference counter for DecryptedImage X-Git-Tag: v252-rc1~152^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9321ad5118d41476c15fbd316706fd0b5070bed2;p=thirdparty%2Fsystemd.git dissect-image: introduce reference counter for DecryptedImage --- diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 5e4883a7a7c..5e1af809975 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1544,19 +1544,22 @@ int dissected_image_mount_and_warn( } #if HAVE_LIBCRYPTSETUP -typedef struct DecryptedPartition { +struct DecryptedPartition { struct crypt_device *device; char *name; bool relinquished; -} DecryptedPartition; +}; +#endif + +typedef struct DecryptedPartition DecryptedPartition; struct DecryptedImage { + unsigned n_ref; DecryptedPartition *decrypted; size_t n_decrypted; }; -#endif -DecryptedImage* decrypted_image_unref(DecryptedImage* d) { +static DecryptedImage* decrypted_image_free(DecryptedImage *d) { #if HAVE_LIBCRYPTSETUP int r; @@ -1584,7 +1587,25 @@ DecryptedImage* decrypted_image_unref(DecryptedImage* d) { return NULL; } +DEFINE_TRIVIAL_REF_UNREF_FUNC(DecryptedImage, decrypted_image, decrypted_image_free); + #if HAVE_LIBCRYPTSETUP +static int decrypted_image_new(DecryptedImage **ret) { + _cleanup_(decrypted_image_unrefp) DecryptedImage *d = NULL; + + assert(ret); + + d = new(DecryptedImage, 1); + if (!d) + return -ENOMEM; + + *d = (DecryptedImage) { + .n_ref = 1, + }; + + *ret = TAKE_PTR(d); + return 0; +} static int make_dm_name_and_node(const void *original_node, const char *suffix, char **ret_name, char **ret_node) { _cleanup_free_ char *name = NULL, *node = NULL; @@ -2080,9 +2101,9 @@ int dissected_image_decrypt( } #if HAVE_LIBCRYPTSETUP - d = new0(DecryptedImage, 1); - if (!d) - return -ENOMEM; + r = decrypted_image_new(&d); + if (r < 0) + return r; for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++) { DissectedPartition *p = m->partitions + i; diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index fe478bde493..6dd52460426 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -277,6 +277,7 @@ int dissected_image_mount_and_warn(DissectedImage *m, const char *where, uid_t u int dissected_image_acquire_metadata(DissectedImage *m, DissectImageFlags extra_flags); +DecryptedImage* decrypted_image_ref(DecryptedImage *p); DecryptedImage* decrypted_image_unref(DecryptedImage *p); DEFINE_TRIVIAL_CLEANUP_FUNC(DecryptedImage*, decrypted_image_unref); int decrypted_image_relinquish(DecryptedImage *d);