summaryrefslogtreecommitdiffstats
path: root/src/kernel-install
diff options
context:
space:
mode:
authorLudwig Nussel <ludwig.nussel@suse.de>2024-01-09 12:29:36 +0100
committerLudwig Nussel <ludwig.nussel@suse.de>2024-01-15 17:16:37 +0100
commit27d420f46645ed584bdd66857eabc25f8c0118bb (patch)
treef69e5730004abfae3cc7aba21c295550cfa90227 /src/kernel-install
parentstrv: introduce strv_copy_unless_empty() (diff)
downloadsystemd-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/kernel-install')
-rw-r--r--src/kernel-install/kernel-install.c35
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, &copy.layout_other);
if (r < 0)
@@ -169,9 +172,9 @@ static int context_copy(const Context *source, Context *ret) {
r = strdup_or_null(source->kernel, &copy.kernel);
if (r < 0)
return r;
- copy.initrds = strv_copy(source->initrds);
- if (!copy.initrds)
- return -ENOMEM;
+ r = strv_copy_unless_empty(source->initrds, &copy.initrds);
+ if (r < 0)
+ return r;
r = strdup_or_null(source->initrd_generator, &copy.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, &copy.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, &copy.plugins);
+ if (r < 0)
+ return r;
+ r = strv_copy_unless_empty(source->argv, &copy.argv);
+ if (r < 0)
+ return r;
+ r = strv_copy_unless_empty(source->envp, &copy.envp);
+ if (r < 0)
+ return r;
*ret = copy;
copy = CONTEXT_NULL;