kernel-install: fix context_copy
Don't reopen or dup values that weren't set before. Fixes add-all.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user