kdb: Simplify management of tmpbuffer in kdb_read()
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>
This commit is contained in:
parent
80bd73c154
commit
64d504cfcd
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue