aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/debug/kdb
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/debug/kdb')
-rw-r--r--kernel/debug/kdb/kdb_main.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 437b74ddca81..de22c8cc6c30 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -683,32 +683,44 @@ static int kdb_defcmd(int argc, const char **argv)
683 return KDB_ARGCOUNT; 683 return KDB_ARGCOUNT;
684 defcmd_set = kmalloc((defcmd_set_count + 1) * sizeof(*defcmd_set), 684 defcmd_set = kmalloc((defcmd_set_count + 1) * sizeof(*defcmd_set),
685 GFP_KDB); 685 GFP_KDB);
686 if (!defcmd_set) { 686 if (!defcmd_set)
687 kdb_printf("Could not allocate new defcmd_set entry for %s\n", 687 goto fail_defcmd;
688 argv[1]);
689 defcmd_set = save_defcmd_set;
690 return KDB_NOTIMP;
691 }
692 memcpy(defcmd_set, save_defcmd_set, 688 memcpy(defcmd_set, save_defcmd_set,
693 defcmd_set_count * sizeof(*defcmd_set)); 689 defcmd_set_count * sizeof(*defcmd_set));
694 kfree(save_defcmd_set);
695 s = defcmd_set + defcmd_set_count; 690 s = defcmd_set + defcmd_set_count;
696 memset(s, 0, sizeof(*s)); 691 memset(s, 0, sizeof(*s));
697 s->usable = 1; 692 s->usable = 1;
698 s->name = kdb_strdup(argv[1], GFP_KDB); 693 s->name = kdb_strdup(argv[1], GFP_KDB);
694 if (!s->name)
695 goto fail_name;
699 s->usage = kdb_strdup(argv[2], GFP_KDB); 696 s->usage = kdb_strdup(argv[2], GFP_KDB);
697 if (!s->usage)
698 goto fail_usage;
700 s->help = kdb_strdup(argv[3], GFP_KDB); 699 s->help = kdb_strdup(argv[3], GFP_KDB);
700 if (!s->help)
701 goto fail_help;
701 if (s->usage[0] == '"') { 702 if (s->usage[0] == '"') {
702 strcpy(s->usage, s->usage+1); 703 strcpy(s->usage, argv[2]+1);
703 s->usage[strlen(s->usage)-1] = '\0'; 704 s->usage[strlen(s->usage)-1] = '\0';
704 } 705 }
705 if (s->help[0] == '"') { 706 if (s->help[0] == '"') {
706 strcpy(s->help, s->help+1); 707 strcpy(s->help, argv[3]+1);
707 s->help[strlen(s->help)-1] = '\0'; 708 s->help[strlen(s->help)-1] = '\0';
708 } 709 }
709 ++defcmd_set_count; 710 ++defcmd_set_count;
710 defcmd_in_progress = 1; 711 defcmd_in_progress = 1;
712 kfree(save_defcmd_set);
711 return 0; 713 return 0;
714fail_help:
715 kfree(s->usage);
716fail_usage:
717 kfree(s->name);
718fail_name:
719 kfree(defcmd_set);
720fail_defcmd:
721 kdb_printf("Could not allocate new defcmd_set entry for %s\n", argv[1]);
722 defcmd_set = save_defcmd_set;
723 return KDB_NOTIMP;
712} 724}
713 725
714/* 726/*