commit 199adb601ff34bdbbd0667fac80dfe0a87bffc2b "common/misc: sparse
fixes" broke the help command trying to fix the sparse error
"command.c:44:38: error: bad constant expression".

As Henrik points out, the fix was bad because the commit used
CONFIG_SYS_MAXARGS whereas the code intended to use the maximum
number of commands (not arguments to a command).

this patch fixes both by making the allocation manually on the heap.

Reported-by: Henrik Nordström <hen...@henriknordstrom.net>
Signed-off-by: Kim Phillips <kim.phill...@freescale.com>
---
tested on an 8572ds board

 common/command.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/common/command.c b/common/command.c
index f51df26..991a7ee 100644
--- a/common/command.c
+++ b/common/command.c
@@ -28,6 +28,7 @@
 #include <common.h>
 #include <command.h>
 #include <linux/ctype.h>
+#include <malloc.h>
 
 /*
  * Use puts() instead of printf() to avoid printf buffer overflow
@@ -40,17 +41,16 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, 
cmd_tbl_t * cmdtp, int
        int i;
        int rcode = 0;
 
-       if (cmd_items > CONFIG_SYS_MAXARGS) {
-               printf("%s: cmd_items %d exceeds hardcoded limit %d."
-                      " Recompile with higher CONFIG_SYS_MAXARGS?\n",
-                      __func__, cmd_items, CONFIG_SYS_MAXARGS);
-               return -1;
-       }
-
        if (argc == 1) {        /*show list of commands */
-               cmd_tbl_t *cmd_array[CONFIG_SYS_MAXARGS];
+               cmd_tbl_t **cmd_array;
                int i, j, swaps;
 
+               cmd_array = malloc(cmd_items * sizeof(*cmd_array));
+               if (!cmd_array) {
+                       printf("error: not enough memory\n");
+                       return 1;
+               }
+
                /* Make array of commands from .uboot_cmd section */
                cmdtp = cmd_start;
                for (i = 0; i < cmd_items; i++) {
@@ -79,13 +79,16 @@ int _do_help (cmd_tbl_t *cmd_start, int cmd_items, 
cmd_tbl_t * cmdtp, int
                        const char *usage = cmd_array[i]->usage;
 
                        /* allow user abort */
-                       if (ctrlc ())
+                       if (ctrlc()) {
+                               free(cmd_array);
                                return 1;
+                       }
                        if (usage == NULL)
                                continue;
                        printf("%-*s- %s\n", CONFIG_SYS_HELP_CMD_WIDTH,
                               cmd_array[i]->name, usage);
                }
+               free(cmd_array);
                return 0;
        }
        /*
-- 
1.8.0


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to