diff options
author | Nathan Lynch <nathanl@linux.ibm.com> | 2023-03-06 15:33:41 -0600 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2023-03-30 23:36:34 +1100 |
commit | 271208ee5e335cb1ad280d22784940daf7ddf820 (patch) | |
tree | 4ebd3b86a0f8fade95a5901d92c45ebae012e2d6 | |
parent | f40b0f6c5c27de167fdd10e541e0a4b5f2bc772b (diff) | |
download | linux-stable-271208ee5e335cb1ad280d22784940daf7ddf820.tar.gz linux-stable-271208ee5e335cb1ad280d22784940daf7ddf820.tar.bz2 linux-stable-271208ee5e335cb1ad280d22784940daf7ddf820.zip |
powerpc/rtas: use memmove for potentially overlapping buffer copy
Using memcpy() isn't safe when buf is identical to rtas_err_buf, which
can happen during boot before slab is up. Full context which may not
be obvious from the diff:
if (altbuf) {
buf = altbuf;
} else {
buf = rtas_err_buf;
if (slab_is_available())
buf = kmalloc(RTAS_ERROR_LOG_MAX, GFP_ATOMIC);
}
if (buf)
memcpy(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX);
This was found by inspection and I'm not aware of it causing problems
in practice. It appears to have been introduced by commit
033ef338b6e0 ("powerpc: Merge rtas.c into arch/powerpc/kernel"); the
old ppc64 version of this code did not have this problem.
Use memmove() instead.
Fixes: 033ef338b6e0 ("powerpc: Merge rtas.c into arch/powerpc/kernel")
Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230220-rtas-queue-for-6-4-v1-2-010e4416f13f@linux.ibm.com
-rw-r--r-- | arch/powerpc/kernel/rtas.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 31175b34856a..9256cfaa8b6f 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -981,7 +981,7 @@ static char *__fetch_rtas_last_error(char *altbuf) buf = kmalloc(RTAS_ERROR_LOG_MAX, GFP_ATOMIC); } if (buf) - memcpy(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX); + memmove(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX); } return buf; |