[PATCH] kdb: fix kernel fault when register kdb debug command exceeds KDB_BASE_CMD_MAX
From: jovi zhang
Date: Tue Nov 09 2010 - 23:26:27 EST
If we register kdb debug command numbers exceeds KDB_BASE_CMD_MAX,
kernel will fault
This patch fix it
Signed-off-by: jovi zhang <bookjovi@xxxxxxxxx>
kernel/debug/kdb/kdb_main.c | Â 10 ++++------
1 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 37755d6..abd46c9 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -82,7 +82,7 @@ static kdbtab_t kdb_base_commands[50];
#define for_each_kdbcmd(cmd, num) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\
   Âfor ((cmd) = kdb_base_commands, (num) = 0;           Â\
      num < kdb_max_commands;                  Â\
- Â Â Â Â Â Ânum == KDB_BASE_CMD_MAX ? cmd = kdb_commands : cmd++, num++)
+ Â Â Â Â Â Ânum++, num == KDB_BASE_CMD_MAX ? cmd = kdb_commands : cmd++)
typedef struct _kdbmsg {
   Âint   km_diag;    Â/* kdb diagnostic */
@@ -2730,7 +2730,7 @@ int kdb_register_repeat(char *cmd,
   Â}
   Âif (i >= kdb_max_commands) {
- Â Â Â Â Â Â Â kdbtab_t *new = kmalloc((kdb_max_commands - KDB_BASE_CMD_MAX +
+ Â Â Â Â Â Â Â kdbtab_t *new = kzalloc((kdb_max_commands - KDB_BASE_CMD_MAX +
            kdb_command_extend) * sizeof(*new), GFP_KDB);
       Âif (!new) {
           Âkdb_printf("Could not allocate new kdb_command "
@@ -2739,13 +2739,11 @@ int kdb_register_repeat(char *cmd,
       Â}
       Âif (kdb_commands) {
           Âmemcpy(new, kdb_commands,
- Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âkdb_max_commands * sizeof(*new));
+ Â Â Â Â Â Â Â Â Â Â Â (kdb_max_commands - KDB_BASE_CMD_MAX) * sizeof(*new));
           Âkfree(kdb_commands);
       Â}
- Â Â Â Â Â Â Â memset(new + kdb_max_commands, 0,
- Â Â Â Â Â Â Â Â Â Â Âkdb_command_extend * sizeof(*new));
       Âkdb_commands = new;
- Â Â Â Â Â Â Â kp = kdb_commands + kdb_max_commands;
+ Â Â Â Â Â Â Â kp = kdb_commands + kdb_max_commands - KDB_BASE_CMD_MAX;
       Âkdb_max_commands += kdb_command_extend;
   Â}
¢éì®&Þ~º&¶¬+-±éÝ¥w®Ë±Êâmébìdz¹Þ)í
æèw*jg¬±¨¶Ýj/êäz¹Þà2Þ¨èÚ&¢)ß«a¶Úþø®G«éh®æj:+v¨wèÙ>W±êÞiÛaxPjØm¶ÿÃ-»+ùd_