[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š_