kernel/debug/kdb/kdb_io.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
strcpy() is deprecated and its behavior is undefined when the source and
destination buffers overlap. Use memmove() instead to avoid any
undefined behavior.
Adjust comments for clarity.
Link: https://github.com/KSPP/linux/issues/88
Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
---
Changes in v2:
- Use memmove() because of strcpy()'s undefined behavior with
overlapping buffers as suggested by Doug Anderson
- Compile-tested only
- Link to v1: https://lore.kernel.org/lkml/20250811170351.68985-1-thorsten.blum@linux.dev/
---
kernel/debug/kdb/kdb_io.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 9b11b10b120c..b12b9db75c1d 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -714,8 +714,8 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap)
* it, depending on the results of the search.
*/
cp++; /* to byte after the newline */
- replaced_byte = *cp; /* remember what/where it was */
- cphold = cp;
+ replaced_byte = *cp; /* remember what it was */
+ cphold = cp; /* remember where it was */
*cp = '\0'; /* end the string for our search */
/*
@@ -732,8 +732,9 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap)
* Shift the buffer left.
*/
*cphold = replaced_byte;
- strcpy(kdb_buffer, cphold);
- len = strlen(kdb_buffer);
+ len = strlen(cphold);
+ /* Use memmove() because the buffers overlap */
+ memmove(kdb_buffer, cphold, len + 1);
next_avail = kdb_buffer + len;
size_avail = sizeof(kdb_buffer) - len;
goto kdb_print_out;
@@ -872,8 +873,9 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap)
*/
if (kdb_grepping_flag && !suspend_grep) {
*cphold = replaced_byte;
- strcpy(kdb_buffer, cphold);
- len = strlen(kdb_buffer);
+ len = strlen(cphold);
+ /* Use memmove() because the buffers overlap */
+ memmove(kdb_buffer, cphold, len + 1);
next_avail = kdb_buffer + len;
size_avail = sizeof(kdb_buffer) - len;
}
--
2.50.1
Hi, On Tue, Aug 12, 2025 at 6:27 AM Thorsten Blum <thorsten.blum@linux.dev> wrote: > > strcpy() is deprecated and its behavior is undefined when the source and > destination buffers overlap. Use memmove() instead to avoid any > undefined behavior. > > Adjust comments for clarity. > > Link: https://github.com/KSPP/linux/issues/88 > Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> > --- > Changes in v2: > - Use memmove() because of strcpy()'s undefined behavior with > overlapping buffers as suggested by Doug Anderson > - Compile-tested only > - Link to v1: https://lore.kernel.org/lkml/20250811170351.68985-1-thorsten.blum@linux.dev/ > --- > kernel/debug/kdb/kdb_io.c | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) Much nicer, thank you! Given that the old code was officially relying on undefined behavior of strcpy() before, I'd personally even add: Fixes: 5d5314d6795f ("kdb: core for kgdb back end (1 of 2)") In any case: Reviewed-by: Douglas Anderson <dianders@chromium.org>
On Tue, Aug 12, 2025 at 09:24:55AM -0700, Doug Anderson wrote: > Hi, > > On Tue, Aug 12, 2025 at 6:27 AM Thorsten Blum <thorsten.blum@linux.dev> wrote: > > > > strcpy() is deprecated and its behavior is undefined when the source and > > destination buffers overlap. Use memmove() instead to avoid any > > undefined behavior. > > > > Adjust comments for clarity. > > > > Link: https://github.com/KSPP/linux/issues/88 > > Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> > > --- > > Changes in v2: > > - Use memmove() because of strcpy()'s undefined behavior with > > overlapping buffers as suggested by Doug Anderson > > - Compile-tested only > > - Link to v1: https://lore.kernel.org/lkml/20250811170351.68985-1-thorsten.blum@linux.dev/ > > --- > > kernel/debug/kdb/kdb_io.c | 14 ++++++++------ > > 1 file changed, 8 insertions(+), 6 deletions(-) > > Much nicer, thank you! > > Given that the old code was officially relying on undefined behavior > of strcpy() before, I'd personally even add: > > Fixes: 5d5314d6795f ("kdb: core for kgdb back end (1 of 2)") > > In any case: > > Reviewed-by: Douglas Anderson <dianders@chromium.org> LGTM... and I agree that this is bug rather than a clean up so am waiting to hear back on the Fixes: . Daniel PS Feel free to roll all three kdb patches discussed recently into a series so I can pull in one go ;-) .
On 15. Aug 2025, at 16:32, Daniel Thompson wrote: > On Tue, Aug 12, 2025 at 09:24:55AM -0700, Doug Anderson wrote: >> >> On Tue, Aug 12, 2025 at 6:27 AM Thorsten Blum wrote: >>> >>> strcpy() is deprecated and its behavior is undefined when the source and >>> destination buffers overlap. Use memmove() instead to avoid any >>> undefined behavior. >>> >>> Adjust comments for clarity. >>> >>> Link: https://github.com/KSPP/linux/issues/88 >>> Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> >>> --- >>> Changes in v2: >>> - Use memmove() because of strcpy()'s undefined behavior with >>> overlapping buffers as suggested by Doug Anderson >>> - Compile-tested only >>> - Link to v1: https://lore.kernel.org/lkml/20250811170351.68985-1-thorsten.blum@linux.dev/ >>> --- >>> kernel/debug/kdb/kdb_io.c | 14 ++++++++------ >>> 1 file changed, 8 insertions(+), 6 deletions(-) >> >> Much nicer, thank you! >> >> Given that the old code was officially relying on undefined behavior >> of strcpy() before, I'd personally even add: >> >> Fixes: 5d5314d6795f ("kdb: core for kgdb back end (1 of 2)") >> >> In any case: >> >> Reviewed-by: Douglas Anderson <dianders@chromium.org> > > LGTM... and I agree that this is bug rather than a clean up so am > waiting to hear back on the Fixes: . Yes, the Fixes: tag is fine, of course. Thanks! How about backporting this to stable? Best, Thorsten
© 2016 - 2025 Red Hat, Inc.