Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'kgdb-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux

Pull kgdb updates from Daniel Thompson:
"A relatively modest collection of changes:

- Adopt kstrtoint() and kstrtol() instead of the simple_strtoXX
family for better error checking of user input.

- Align the print behavour when breakpoints are enabled and disabled
by adopting the current behaviour of breakpoint disable for both.

- Remove some of the (rather odd and user hostile) hex fallbacks and
require kdb users to prefix with 0x instead.

- Tidy up (and fix) control code handling in kdb's keyboard code.
This makes the control code handling at the keyboard behave the
same way as it does via the UART.

- Switch my own entry in MAINTAINERS to my @kernel.org address"

* tag 'kgdb-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux:
kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode
MAINTAINERS: Use Daniel Thompson's korg address for kgdb work
kdb: Fix breakpoint enable to be silent if already enabled
kdb: Remove fallback interpretation of arbitrary numbers as hex
trace: kdb: Replace simple_strtoul with kstrtoul in kdb_ftdump
kdb: Replace the use of simple_strto with safer kstrto in kdb_main

+51 -72
+1 -1
MAINTAINERS
··· 12670 12670 12671 12671 KGDB / KDB /debug_core 12672 12672 M: Jason Wessel <jason.wessel@windriver.com> 12673 - M: Daniel Thompson <daniel.thompson@linaro.org> 12673 + M: Daniel Thompson <danielt@kernel.org> 12674 12674 R: Douglas Anderson <dianders@chromium.org> 12675 12675 L: kgdb-bugreport@lists.sourceforge.net 12676 12676 S: Maintained
+4 -2
kernel/debug/kdb/kdb_bp.c
··· 460 460 461 461 break; 462 462 case KDBCMD_BE: 463 + if (bp->bp_enabled) 464 + break; 465 + 463 466 bp->bp_enabled = 1; 464 467 465 468 kdb_printf("Breakpoint %d at " 466 - kdb_bfd_vma_fmt " enabled", 469 + kdb_bfd_vma_fmt " enabled\n", 467 470 i, bp->bp_addr); 468 471 469 - kdb_printf("\n"); 470 472 break; 471 473 case KDBCMD_BD: 472 474 if (!bp->bp_enabled)
+24 -9
kernel/debug/kdb/kdb_keyboard.c
··· 25 25 #define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ 26 26 #define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */ 27 27 28 + #define CTRL(c) ((c) - 64) 29 + 28 30 static int kbd_exists; 29 31 static int kbd_last_ret; 30 32 ··· 125 123 return 8; 126 124 } 127 125 128 - /* Special Key */ 126 + /* Translate special keys to equivalent CTRL control characters */ 129 127 switch (scancode) { 130 128 case 0xF: /* Tab */ 131 - return 9; 129 + return CTRL('I'); 132 130 case 0x53: /* Del */ 133 - return 4; 131 + return CTRL('D'); 134 132 case 0x47: /* Home */ 135 - return 1; 133 + return CTRL('A'); 136 134 case 0x4F: /* End */ 137 - return 5; 135 + return CTRL('E'); 138 136 case 0x4B: /* Left */ 139 - return 2; 137 + return CTRL('B'); 140 138 case 0x48: /* Up */ 141 - return 16; 139 + return CTRL('P'); 142 140 case 0x50: /* Down */ 143 - return 14; 141 + return CTRL('N'); 144 142 case 0x4D: /* Right */ 145 - return 6; 143 + return CTRL('F'); 146 144 } 147 145 148 146 if (scancode == 0xe0) ··· 174 172 switch (KTYP(keychar)) { 175 173 case KT_LETTER: 176 174 case KT_LATIN: 175 + switch (keychar) { 176 + /* non-printable supported control characters */ 177 + case CTRL('A'): /* Home */ 178 + case CTRL('B'): /* Left */ 179 + case CTRL('D'): /* Del */ 180 + case CTRL('E'): /* End */ 181 + case CTRL('F'): /* Right */ 182 + case CTRL('I'): /* Tab */ 183 + case CTRL('N'): /* Down */ 184 + case CTRL('P'): /* Up */ 185 + return keychar; 186 + } 187 + 177 188 if (isprint(keychar)) 178 189 break; /* printable characters */ 179 190 fallthrough;
+17 -52
kernel/debug/kdb/kdb_main.c
··· 306 306 return KDB_NOTENV; 307 307 if (strlen(ep) == 0) 308 308 return KDB_NOENVVALUE; 309 - 310 - *value = simple_strtoul(ep, NULL, 0); 309 + if (kstrtoul(ep, 0, value)) 310 + return KDB_BADINT; 311 311 312 312 return 0; 313 313 } ··· 402 402 */ 403 403 int kdbgetularg(const char *arg, unsigned long *value) 404 404 { 405 - char *endp; 406 - unsigned long val; 407 - 408 - val = simple_strtoul(arg, &endp, 0); 409 - 410 - if (endp == arg) { 411 - /* 412 - * Also try base 16, for us folks too lazy to type the 413 - * leading 0x... 414 - */ 415 - val = simple_strtoul(arg, &endp, 16); 416 - if (endp == arg) 417 - return KDB_BADINT; 418 - } 419 - 420 - *value = val; 421 - 405 + if (kstrtoul(arg, 0, value)) 406 + return KDB_BADINT; 422 407 return 0; 423 408 } 424 409 425 410 int kdbgetu64arg(const char *arg, u64 *value) 426 411 { 427 - char *endp; 428 - u64 val; 429 - 430 - val = simple_strtoull(arg, &endp, 0); 431 - 432 - if (endp == arg) { 433 - 434 - val = simple_strtoull(arg, &endp, 16); 435 - if (endp == arg) 436 - return KDB_BADINT; 437 - } 438 - 439 - *value = val; 440 - 412 + if (kstrtou64(arg, 0, value)) 413 + return KDB_BADINT; 441 414 return 0; 442 415 } 443 416 ··· 446 473 */ 447 474 if (strcmp(argv[1], "KDBDEBUG") == 0) { 448 475 unsigned int debugflags; 449 - char *cp; 476 + int ret; 450 477 451 - debugflags = simple_strtoul(argv[2], &cp, 0); 452 - if (cp == argv[2] || debugflags & ~KDB_DEBUG_FLAG_MASK) { 478 + ret = kstrtouint(argv[2], 0, &debugflags); 479 + if (ret || debugflags & ~KDB_DEBUG_FLAG_MASK) { 453 480 kdb_printf("kdb: illegal debug flags '%s'\n", 454 481 argv[2]); 455 482 return 0; ··· 1592 1619 if (!argv[0][3]) 1593 1620 valid = 1; 1594 1621 else if (argv[0][3] == 'c' && argv[0][4]) { 1595 - char *p; 1596 - repeat = simple_strtoul(argv[0] + 4, &p, 10); 1622 + if (kstrtouint(argv[0] + 4, 10, &repeat)) 1623 + return KDB_BADINT; 1597 1624 mdcount = ((repeat * bytesperword) + 15) / 16; 1598 - valid = !*p; 1625 + valid = 1; 1599 1626 } 1600 1627 last_repeat = repeat; 1601 1628 } else if (strcmp(argv[0], "md") == 0) ··· 2056 2083 if (argc > 2) 2057 2084 return KDB_ARGCOUNT; 2058 2085 if (argc) { 2059 - char *cp; 2060 - lines = simple_strtol(argv[1], &cp, 0); 2061 - if (*cp) 2086 + if (kstrtoint(argv[1], 0, &lines)) 2062 2087 lines = 0; 2063 - if (argc > 1) { 2064 - adjust = simple_strtoul(argv[2], &cp, 0); 2065 - if (*cp || adjust < 0) 2066 - adjust = 0; 2067 - } 2088 + if (argc > 1 && (kstrtoint(argv[2], 0, &adjust) || adjust < 0)) 2089 + adjust = 0; 2068 2090 } 2069 2091 2070 2092 /* disable LOGGING if set */ ··· 2396 2428 static int kdb_kill(int argc, const char **argv) 2397 2429 { 2398 2430 long sig, pid; 2399 - char *endp; 2400 2431 struct task_struct *p; 2401 2432 2402 2433 if (argc != 2) 2403 2434 return KDB_ARGCOUNT; 2404 2435 2405 - sig = simple_strtol(argv[1], &endp, 0); 2406 - if (*endp) 2436 + if (kstrtol(argv[1], 0, &sig)) 2407 2437 return KDB_BADINT; 2408 2438 if ((sig >= 0) || !valid_signal(-sig)) { 2409 2439 kdb_printf("Invalid signal parameter.<-signal>\n"); ··· 2409 2443 } 2410 2444 sig = -sig; 2411 2445 2412 - pid = simple_strtol(argv[2], &endp, 0); 2413 - if (*endp) 2446 + if (kstrtol(argv[2], 0, &pid)) 2414 2447 return KDB_BADINT; 2415 2448 if (pid <= 0) { 2416 2449 kdb_printf("Process ID must be large than 0.\n");
+5 -8
kernel/trace/trace_kdb.c
··· 96 96 { 97 97 int skip_entries = 0; 98 98 long cpu_file; 99 - char *cp; 99 + int err; 100 100 int cnt; 101 101 int cpu; 102 102 103 103 if (argc > 2) 104 104 return KDB_ARGCOUNT; 105 105 106 - if (argc) { 107 - skip_entries = simple_strtol(argv[1], &cp, 0); 108 - if (*cp) 109 - skip_entries = 0; 110 - } 106 + if (argc && kstrtoint(argv[1], 0, &skip_entries)) 107 + return KDB_BADINT; 111 108 112 109 if (argc == 2) { 113 - cpu_file = simple_strtol(argv[2], &cp, 0); 114 - if (*cp || cpu_file >= NR_CPUS || cpu_file < 0 || 110 + err = kstrtol(argv[2], 0, &cpu_file); 111 + if (err || cpu_file >= NR_CPUS || cpu_file < 0 || 115 112 !cpu_online(cpu_file)) 116 113 return KDB_BADINT; 117 114 } else {