kdb: Simplify management of tmpbuffer in kdb_read()
authorDaniel Thompson <daniel.thompson@linaro.org>
Wed, 24 Apr 2024 14:03:40 +0000 (15:03 +0100)
committerDaniel Thompson <daniel.thompson@linaro.org>
Fri, 26 Apr 2024 16:13:31 +0000 (17:13 +0100)
The current approach to filling tmpbuffer with completion candidates is
confusing, with the buffer management being especially hard to reason
about. That's because it doesn't copy the completion canidate into
tmpbuffer, instead of copies a whole bunch of other nonsense and then
runs the completion search from the middle of tmpbuffer!

Change this to copy nothing but the completion candidate into tmpbuffer.

Pretty much everything else in this patch is renaming to reflect the
above change:

    s/p_tmp/tmpbuffer/
    s/buf_size/sizeof(tmpbuffer)/

Reviewed-by: Douglas Anderson <dianders@chromium.org>
Tested-by: Justin Stitt <justinstitt@google.com>
Link: https://lore.kernel.org/r/20240424-kgdb_read_refactor-v3-7-f236dbe9828d@linaro.org
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
kernel/debug/kdb/kdb_io.c

index 40617f36a6db483a3c23b389922e083d063468de..3131334d7a81ca4b382512e1302ed9dbf9f403a5 100644 (file)
@@ -239,6 +239,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
                                                 * and null byte */
        char *lastchar;
        char *p_tmp;
+       char tmp;
        static char tmpbuffer[CMD_BUFLEN];
        int len = strlen(buffer);
        int len_tmp;
@@ -246,8 +247,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
        int count;
        int i;
        int diag, dtab_count;
-       int key, buf_size, ret;
-
+       int key, ret;
 
        diag = kdbgetintenv("DTABCOUNT", &dtab_count);
        if (diag)
@@ -329,21 +329,16 @@ poll_again:
        case 9: /* Tab */
                if (tab < 2)
                        ++tab;
-               p_tmp = buffer;
-               while (*p_tmp == ' ')
-                       p_tmp++;
-               if (p_tmp > cp)
-                       break;
-               memcpy(tmpbuffer, p_tmp, cp-p_tmp);
-               *(tmpbuffer + (cp-p_tmp)) = '\0';
-               p_tmp = strrchr(tmpbuffer, ' ');
-               if (p_tmp)
-                       ++p_tmp;
-               else
-                       p_tmp = tmpbuffer;
-               len = strlen(p_tmp);
-               buf_size = sizeof(tmpbuffer) - (p_tmp - tmpbuffer);
-               count = kallsyms_symbol_complete(p_tmp, buf_size);
+
+               tmp = *cp;
+               *cp = '\0';
+               p_tmp = strrchr(buffer, ' ');
+               p_tmp = (p_tmp ? p_tmp + 1 : buffer);
+               strscpy(tmpbuffer, p_tmp, sizeof(tmpbuffer));
+               *cp = tmp;
+
+               len = strlen(tmpbuffer);
+               count = kallsyms_symbol_complete(tmpbuffer, sizeof(tmpbuffer));
                if (tab == 2 && count > 0) {
                        kdb_printf("\n%d symbols are found.", count);
                        if (count > dtab_count) {
@@ -355,14 +350,14 @@ poll_again:
                        }
                        kdb_printf("\n");
                        for (i = 0; i < count; i++) {
-                               ret = kallsyms_symbol_next(p_tmp, i, buf_size);
+                               ret = kallsyms_symbol_next(tmpbuffer, i, sizeof(tmpbuffer));
                                if (WARN_ON(!ret))
                                        break;
                                if (ret != -E2BIG)
-                                       kdb_printf("%s ", p_tmp);
+                                       kdb_printf("%s ", tmpbuffer);
                                else
-                                       kdb_printf("%s... ", p_tmp);
-                               *(p_tmp + len) = '\0';
+                                       kdb_printf("%s... ", tmpbuffer);
+                               tmpbuffer[len] = '\0';
                        }
                        if (i >= dtab_count)
                                kdb_printf("...");
@@ -373,14 +368,14 @@ poll_again:
                                kdb_position_cursor(kdb_prompt_str, buffer, cp);
                } else if (tab != 2 && count > 0) {
                        /* How many new characters do we want from tmpbuffer? */
-                       len_tmp = strlen(p_tmp) - len;
+                       len_tmp = strlen(tmpbuffer) - len;
                        if (lastchar + len_tmp >= bufend)
                                len_tmp = bufend - lastchar;
 
                        if (len_tmp) {
                                /* + 1 ensures the '\0' is memmove'd */
                                memmove(cp+len_tmp, cp, (lastchar-cp) + 1);
-                               memcpy(cp, p_tmp+len, len_tmp);
+                               memcpy(cp, tmpbuffer+len, len_tmp);
                                kdb_printf("%s", cp);
                                cp += len_tmp;
                                lastchar += len_tmp;