From 27d420f46645ed584bdd66857eabc25f8c0118bb Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Tue, 9 Jan 2024 12:29:36 +0100 Subject: kernel-install: fix context_copy Don't reopen or dup values that weren't set before. Fixes add-all. --- src/kernel-install/kernel-install.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/kernel-install/kernel-install.c b/src/kernel-install/kernel-install.c index a93b4e688f..882388b345 100644 --- a/src/kernel-install/kernel-install.c +++ b/src/kernel-install/kernel-install.c @@ -133,9 +133,10 @@ static int context_copy(const Context *source, Context *ret) { assert(source); assert(ret); + assert(source->rfd >= 0 || source->rfd == AT_FDCWD); _cleanup_(context_done) Context copy = (Context) { - .rfd = -EBADF, + .rfd = AT_FDCWD, .action = source->action, .machine_id = source->machine_id, .machine_id_is_random = source->machine_id_is_random, @@ -144,9 +145,11 @@ static int context_copy(const Context *source, Context *ret) { .entry_token_type = source->entry_token_type, }; - copy.rfd = fd_reopen(source->rfd, O_CLOEXEC|O_DIRECTORY|O_PATH); - if (copy.rfd < 0) - return copy.rfd; + if (source->rfd >= 0) { + copy.rfd = fd_reopen(source->rfd, O_CLOEXEC|O_DIRECTORY|O_PATH); + if (copy.rfd < 0) + return copy.rfd; + } r = strdup_or_null(source->layout_other, ©.layout_other); if (r < 0) @@ -169,9 +172,9 @@ static int context_copy(const Context *source, Context *ret) { r = strdup_or_null(source->kernel, ©.kernel); if (r < 0) return r; - copy.initrds = strv_copy(source->initrds); - if (!copy.initrds) - return -ENOMEM; + r = strv_copy_unless_empty(source->initrds, ©.initrds); + if (r < 0) + return r; r = strdup_or_null(source->initrd_generator, ©.initrd_generator); if (r < 0) return r; @@ -181,15 +184,15 @@ static int context_copy(const Context *source, Context *ret) { r = strdup_or_null(source->staging_area, ©.staging_area); if (r < 0) return r; - copy.plugins = strv_copy(source->plugins); - if (!copy.plugins) - return -ENOMEM; - copy.argv = strv_copy(source->argv); - if (!copy.argv) - return -ENOMEM; - copy.envp = strv_copy(source->envp); - if (!copy.envp) - return -ENOMEM; + r = strv_copy_unless_empty(source->plugins, ©.plugins); + if (r < 0) + return r; + r = strv_copy_unless_empty(source->argv, ©.argv); + if (r < 0) + return r; + r = strv_copy_unless_empty(source->envp, ©.envp); + if (r < 0) + return r; *ret = copy; copy = CONTEXT_NULL; -- cgit v1.2.3