diff options
author | Bhupesh Sharma <bhsharma@redhat.com> | 2018-12-17 00:46:52 +0530 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2019-01-09 13:22:34 +0100 |
commit | 583dbd57f99747fa891ddd517930af9699c2e936 (patch) | |
tree | 5567ccbaeaa3fabdb325a363afad28f0ca1d432b | |
parent | e5dfb354021983b7d8dba64f29aa2dd1433ec230 (diff) | |
download | kexec-tools-583dbd57f99747fa891ddd517930af9699c2e936.tar.gz |
kexec/dt-ops.c: Fix check against 'fdt_add_subnode' return value
Vicenç reported (via [1]) that currently executing kexec with
'--dtb' option and passing a .dtb which doesn't have a '/chosen' node
leads to the following error:
# kexec -d --dtb dtb_without_chosen_node.dtb --append 'cmdline' --load Image
dtb_set_property: fdt_add_subnode failed: <valid offset/length>
kexec: Set device tree bootargs failed.
This happens because currently we check the return value of
'fdt_add_subnode()' function call in 'dt-ops.c' incorrectly:
result = fdt_add_subnode(new_dtb, nodeoffset, node);
if (result) {
dbgprintf("%s: fdt_add_subnode failed: %s\n", _func__,
fdt_strerror(result));
goto on_error;
}
As we can see in 'fdt_rw.c', a positive return value from
'fdt_add_subnode()' function doesn't indicate an error.
We can see that the Linux kernel (see 'drivers/firmware/efi/libstub/fdt.c'
for example) also checks the 'fdt_add_subnode()' function against negative
return values for errors. See an example below from 'update_fdt()' function in
'drivers/firmware/efi/libstub/fdt.c':
node = fdt_add_subnode(fdt, 0, "chosen");
if (node < 0) {
status = node;
<..snip..>
goto fdt_set_fail;
}
This patch fixes the same in 'kexec-tools'.
[1]. http://lists.infradead.org/pipermail/kexec/2018-October/021746.html
Cc: Simon Horman <horms@verge.net.au>
Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reported-by: Vicente Bergas <vicencb@gmail.com>
Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/dt-ops.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kexec/dt-ops.c b/kexec/dt-ops.c index 915dbf55..f15174c3 100644 --- a/kexec/dt-ops.c +++ b/kexec/dt-ops.c @@ -84,7 +84,7 @@ int dtb_set_property(char **dtb, off_t *dtb_size, const char *node, if (nodeoffset == -FDT_ERR_NOTFOUND) { result = fdt_add_subnode(new_dtb, nodeoffset, node); - if (result) { + if (result < 0) { dbgprintf("%s: fdt_add_subnode failed: %s\n", __func__, fdt_strerror(result)); goto on_error; |