diff options
author | Simon Glass <sjg@chromium.org> | 2019-10-21 17:26:49 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2019-10-27 10:56:51 -0600 |
commit | 65b2d96f4c5e3f9084bc04cf5a5d7fc7a2285a72 (patch) | |
tree | 4be404e23883cac805c67e93a176a7ef512facdd | |
parent | ed54bdaf88758854905b5d8ca5036a078b9ef168 (diff) | |
download | u-boot-65b2d96f4c5e3f9084bc04cf5a5d7fc7a2285a72.tar.gz |
bootstage: Avoid conflicts between stash/unstash
At present there is a single shared address for bootstage data in both
TPL and SPL. If SPL unstashs TPL bootstage info and then stashes it again
to pass it to U-Boot, the new stash overwrites the strings of the old
stash.
Fix this by duplicating the strings into the malloc() region. This should
be a small code. Fix the header-file order at the same time.
This problem doesn't happen at the next stage (SPL->U-Boot) since U-Boot
relocates the boostage data.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | common/bootstage.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/common/bootstage.c b/common/bootstage.c index fe36bac047..4557ed4508 100644 --- a/common/bootstage.c +++ b/common/bootstage.c @@ -10,9 +10,10 @@ */ #include <common.h> -#include <linux/libfdt.h> #include <malloc.h> +#include <spl.h> #include <linux/compiler.h> +#include <linux/libfdt.h> DECLARE_GLOBAL_DATA_PTR; @@ -472,6 +473,8 @@ int bootstage_unstash(const void *base, int size) for (rec = data->record + data->next_id, i = 0; i < hdr->count; i++, rec++) { rec->name = ptr; + if (spl_phase() == PHASE_SPL) + rec->name = strdup(ptr); /* Assume no data corruption here */ ptr += strlen(ptr) + 1; |