diff options
author | Ludwig Nussel <ludwig.nussel@suse.de> | 2024-01-09 12:29:36 +0100 |
---|---|---|
committer | Ludwig Nussel <ludwig.nussel@suse.de> | 2024-01-15 17:16:37 +0100 |
commit | 27d420f46645ed584bdd66857eabc25f8c0118bb (patch) | |
tree | f69e5730004abfae3cc7aba21c295550cfa90227 /src | |
parent | strv: introduce strv_copy_unless_empty() (diff) | |
download | systemd-27d420f46645ed584bdd66857eabc25f8c0118bb.tar.xz systemd-27d420f46645ed584bdd66857eabc25f8c0118bb.zip |
kernel-install: fix context_copy
Don't reopen or dup values that weren't set before. Fixes add-all.
Diffstat (limited to 'src')
-rw-r--r-- | src/kernel-install/kernel-install.c | 35 |
1 files changed, 19 insertions, 16 deletions
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; |