History

kdb: Prevent kernel oops with kdb_defcmd

The kdb_defcmd can only be used to display the available command aliases while using the kernel debug shell. If you try to define a new macro while the kernel debugger is active it will oops. The debug shell macros must use pre-allocated memory set aside at the time kdb_init() is run, and the kdb_defcmd is restricted to only working at the time that the kdb_init sequence is being run, which only occurs if you actually activate the kernel debugger.

Jason Wessel committed 13 years ago

Commit a37372f1 parent 1b2caa21 file · +6 −2Browse files

Showing the changes to kernel/debug (1 of 1 file). Show all

Unified · Split

kernel/debug/kdb/kdb_main.c+6−2
@@ -681,6 +681,10 @@ static int kdb_defcmd(int argc, const char **argv) · 680 unmodified lines
681 }681 }
682 if (argc != 3)682 if (argc != 3)
683 return KDB_ARGCOUNT;683 return KDB_ARGCOUNT;
684 if (in_dbg_master()) {
685 kdb_printf("Command only available during kdb_init()\n");
686 return KDB_NOTIMP;
687 }
684 defcmd_set = kmalloc((defcmd_set_count + 1) * sizeof(*defcmd_set),688 defcmd_set = kmalloc((defcmd_set_count + 1) * sizeof(*defcmd_set),
685 GFP_KDB);689 GFP_KDB);
686 if (!defcmd_set)690 if (!defcmd_set)
@@ -2796,8 +2800,8 @@ static void __init kdb_inittab(void) · 2109 unmodified lines
2796 "Stack traceback", 1, KDB_REPEAT_NONE);2800 "Stack traceback", 1, KDB_REPEAT_NONE);
2797 kdb_register_repeat("btp", kdb_bt, "<pid>",2801 kdb_register_repeat("btp", kdb_bt, "<pid>",
2798 "Display stack for process <pid>", 0, KDB_REPEAT_NONE);2802 "Display stack for process <pid>", 0, KDB_REPEAT_NONE);
2799 kdb_register_repeat("bta", kdb_bt, "[DRSTCZEUIMA]",2803 kdb_register_repeat("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]",
2800 "Display stack all processes", 0, KDB_REPEAT_NONE);2804 "Backtrace all processes matching state flag", 0, KDB_REPEAT_NONE);
2801 kdb_register_repeat("btc", kdb_bt, "",2805 kdb_register_repeat("btc", kdb_bt, "",
2802 "Backtrace current process on each cpu", 0, KDB_REPEAT_NONE);2806 "Backtrace current process on each cpu", 0, KDB_REPEAT_NONE);
2803 kdb_register_repeat("btt", kdb_bt, "<vaddr>",2807 kdb_register_repeat("btt", kdb_bt, "<vaddr>",