diff options
Diffstat (limited to 'kernel/debug/kdb')
-rw-r--r-- | kernel/debug/kdb/kdb_main.c | 30 |
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; |
714 | fail_help: | ||
715 | kfree(s->usage); | ||
716 | fail_usage: | ||
717 | kfree(s->name); | ||
718 | fail_name: | ||
719 | kfree(defcmd_set); | ||
720 | fail_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 | /* |