From: Nathan Lynch <nath...@linux.ibm.com>

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 <nath...@linux.ibm.com>
---
 arch/powerpc/kernel/rtas.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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;

-- 
2.39.1

Reply via email to