| From 2601bb02aede9d0753359fb105dccadf12bc0766 Mon Sep 17 00:00:00 2001 |
| From: Prarit Bhargava <prarit@redhat.com> |
| Date: Thu, 20 Sep 2018 08:59:14 -0400 |
| Subject: kdb: Use strscpy with destination buffer size |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| [ Upstream commit c2b94c72d93d0929f48157eef128c4f9d2e603ce ] |
| |
| gcc 8.1.0 warns with: |
| |
| kernel/debug/kdb/kdb_support.c: In function ‘kallsyms_symbol_next’: |
| kernel/debug/kdb/kdb_support.c:239:4: warning: ‘strncpy’ specified bound depends on the length of the source argument [-Wstringop-overflow=] |
| strncpy(prefix_name, name, strlen(name)+1); |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| kernel/debug/kdb/kdb_support.c:239:31: note: length computed here |
| |
| Use strscpy() with the destination buffer size, and use ellipses when |
| displaying truncated symbols. |
| |
| v2: Use strscpy() |
| |
| Signed-off-by: Prarit Bhargava <prarit@redhat.com> |
| Cc: Jonathan Toppins <jtoppins@redhat.com> |
| Cc: Jason Wessel <jason.wessel@windriver.com> |
| Cc: Daniel Thompson <daniel.thompson@linaro.org> |
| Cc: kgdb-bugreport@lists.sourceforge.net |
| Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> |
| Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/debug/kdb/kdb_io.c | 15 +++++++++------ |
| kernel/debug/kdb/kdb_private.h | 2 +- |
| kernel/debug/kdb/kdb_support.c | 10 +++++----- |
| 3 files changed, 15 insertions(+), 12 deletions(-) |
| |
| diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c |
| index 77777d918676..cc892a9e109d 100644 |
| --- a/kernel/debug/kdb/kdb_io.c |
| +++ b/kernel/debug/kdb/kdb_io.c |
| @@ -215,7 +215,7 @@ static char *kdb_read(char *buffer, size_t bufsize) |
| int count; |
| int i; |
| int diag, dtab_count; |
| - int key; |
| + int key, buf_size, ret; |
| |
| |
| diag = kdbgetintenv("DTABCOUNT", &dtab_count); |
| @@ -335,9 +335,8 @@ poll_again: |
| else |
| p_tmp = tmpbuffer; |
| len = strlen(p_tmp); |
| - count = kallsyms_symbol_complete(p_tmp, |
| - sizeof(tmpbuffer) - |
| - (p_tmp - tmpbuffer)); |
| + buf_size = sizeof(tmpbuffer) - (p_tmp - tmpbuffer); |
| + count = kallsyms_symbol_complete(p_tmp, buf_size); |
| if (tab == 2 && count > 0) { |
| kdb_printf("\n%d symbols are found.", count); |
| if (count > dtab_count) { |
| @@ -349,9 +348,13 @@ poll_again: |
| } |
| kdb_printf("\n"); |
| for (i = 0; i < count; i++) { |
| - if (WARN_ON(!kallsyms_symbol_next(p_tmp, i))) |
| + ret = kallsyms_symbol_next(p_tmp, i, buf_size); |
| + if (WARN_ON(!ret)) |
| break; |
| - kdb_printf("%s ", p_tmp); |
| + if (ret != -E2BIG) |
| + kdb_printf("%s ", p_tmp); |
| + else |
| + kdb_printf("%s... ", p_tmp); |
| *(p_tmp + len) = '\0'; |
| } |
| if (i >= dtab_count) |
| diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h |
| index 75014d7f4568..533e04e75a9c 100644 |
| --- a/kernel/debug/kdb/kdb_private.h |
| +++ b/kernel/debug/kdb/kdb_private.h |
| @@ -83,7 +83,7 @@ typedef struct __ksymtab { |
| unsigned long sym_start; |
| unsigned long sym_end; |
| } kdb_symtab_t; |
| -extern int kallsyms_symbol_next(char *prefix_name, int flag); |
| +extern int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size); |
| extern int kallsyms_symbol_complete(char *prefix_name, int max_len); |
| |
| /* Exported Symbols for kernel loadable modules to use. */ |
| diff --git a/kernel/debug/kdb/kdb_support.c b/kernel/debug/kdb/kdb_support.c |
| index d35cc2d3a4cc..2aed4a33521b 100644 |
| --- a/kernel/debug/kdb/kdb_support.c |
| +++ b/kernel/debug/kdb/kdb_support.c |
| @@ -221,11 +221,13 @@ int kallsyms_symbol_complete(char *prefix_name, int max_len) |
| * Parameters: |
| * prefix_name prefix of a symbol name to lookup |
| * flag 0 means search from the head, 1 means continue search. |
| + * buf_size maximum length that can be written to prefix_name |
| + * buffer |
| * Returns: |
| * 1 if a symbol matches the given prefix. |
| * 0 if no string found |
| */ |
| -int kallsyms_symbol_next(char *prefix_name, int flag) |
| +int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size) |
| { |
| int prefix_len = strlen(prefix_name); |
| static loff_t pos; |
| @@ -235,10 +237,8 @@ int kallsyms_symbol_next(char *prefix_name, int flag) |
| pos = 0; |
| |
| while ((name = kdb_walk_kallsyms(&pos))) { |
| - if (strncmp(name, prefix_name, prefix_len) == 0) { |
| - strncpy(prefix_name, name, strlen(name)+1); |
| - return 1; |
| - } |
| + if (!strncmp(name, prefix_name, prefix_len)) |
| + return strscpy(prefix_name, name, buf_size); |
| } |
| return 0; |
| } |
| -- |
| 2.17.1 |
| |