Remove maxargs from the command structure and move bounds checking
to individual functions.

This is a subset of the changes created by the real patch, and is for
reviewing only, and not applying. The real patch is much too large for
the mailing list.

Signed-off-by: John Schmoller <jschmol...@xes-inc.com>
---
Since v1:
 - This patch is now a subset of the real patch. It is now small enough to
 be posted.

 common/cmd_eeprom.c |    7 ++---
 common/cmd_elf.c    |   18 ++++++++----
 common/cmd_i2c.c    |   75 +++++++++++++++++++--------------------------------
 common/hush.c       |   11 ++-----
 common/kgdb.c       |    2 +-
 common/lcd.c        |    5 +++-
 common/main.c       |   19 +++++--------
 include/command.h   |   22 +++++++++------
 8 files changed, 71 insertions(+), 88 deletions(-)

diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c
index 519b510..b645f97 100644
--- a/common/cmd_eeprom.c
+++ b/common/cmd_eeprom.c
@@ -104,8 +104,7 @@ int do_eeprom ( cmd_tbl_t * cmdtp, int flag, int argc, char 
*argv[])
                }
        }
 
-       cmd_usage(cmdtp);
-       return 1;
+       return CMD_ERR_USAGE;
 }
 #endif
 
@@ -422,7 +421,7 @@ void eeprom_init  (void)
 
 #ifdef CONFIG_SYS_I2C_MULTI_EEPROMS
 U_BOOT_CMD(
-       eeprom, 6,      1,      do_eeprom,
+       eeprom, 1,      do_eeprom,
        "EEPROM sub-system",
        "read  devaddr addr off cnt\n"
        "eeprom write devaddr addr off cnt\n"
@@ -430,7 +429,7 @@ U_BOOT_CMD(
 );
 #else /* One EEPROM */
 U_BOOT_CMD(
-       eeprom, 5,      1,      do_eeprom,
+       eeprom, 1,      do_eeprom,
        "EEPROM sub-system",
        "read  addr off cnt\n"
        "eeprom write addr off cnt\n"
diff --git a/common/cmd_elf.c b/common/cmd_elf.c
index 63f6fe7..26fa346 100644
--- a/common/cmd_elf.c
+++ b/common/cmd_elf.c
@@ -64,10 +64,13 @@ int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        /* -------------------------------------------------- */
        int rcode = 0;
 
-       if (argc < 2)
+       if (argc == 1) {
                addr = load_addr;
-       else
+       } else if (argc == 2) {
                addr = simple_strtoul (argv[1], NULL, 16);
+       } else {
+               return CMD_ERR_USAGE;
+       }
 
        if (!valid_elf_image (addr))
                return 1;
@@ -107,10 +110,13 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
         * If we don't know where the image is then we're done.
         */
 
-       if (argc < 2)
+       if (argc == 1) {
                addr = load_addr;
-       else
+       } else if (argc == 2) {
                addr = simple_strtoul (argv[1], NULL, 16);
+       } else {
+               return CMD_ERR_USAGE;
+       }
 
 #if defined(CONFIG_CMD_NET)
        /* Check to see if we need to tftp the image ourselves before starting 
*/
@@ -311,13 +317,13 @@ unsigned long load_elf_image (unsigned long addr)
 
 /* ====================================================================== */
 U_BOOT_CMD(
-       bootelf,      2,      0,      do_bootelf,
+       bootelf,      0,      do_bootelf,
        "Boot from an ELF image in memory",
        " [address] - load address of ELF image."
 );
 
 U_BOOT_CMD(
-       bootvx,      2,      0,      do_bootvx,
+       bootvx,      0,      do_bootvx,
        "Boot vxWorks from an ELF image",
        " [address] - load address of vxWorks ELF image."
 );
diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 62cbd33..d4d07e5 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -168,10 +168,8 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        alen   = i2c_dp_last_alen;
        length = i2c_dp_last_length;
 
-       if (argc < 3) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 3)
+               return CMD_ERR_USAGE;
 
        if ((flag & CMD_FLAG_REPEAT) == 0) {
                /*
@@ -193,10 +191,8 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
                for (j = 0; j < 8; j++) {
                        if (argv[2][j] == '.') {
                                alen = argv[2][j+1] - '0';
-                               if (alen > 4) {
-                                       cmd_usage(cmdtp);
-                                       return 1;
-                               }
+                               if (alen > 4)
+                                       return CMD_ERR_USAGE;
                                break;
                        } else if (argv[2][j] == '\0')
                                break;
@@ -269,10 +265,8 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        int     count;
        int     j;
 
-       if ((argc < 4) || (argc > 5)) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if ((argc < 4) || (argc > 5))
+               return CMD_ERR_USAGE;
 
        /*
         * Chip is always specified.
@@ -287,10 +281,8 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        for (j = 0; j < 8; j++) {
                if (argv[2][j] == '.') {
                        alen = argv[2][j+1] - '0';
-                       if (alen > 4) {
-                               cmd_usage(cmdtp);
-                               return 1;
-                       }
+                       if (alen > 4)
+                               return CMD_ERR_USAGE;
                        break;
                } else if (argv[2][j] == '\0')
                        break;
@@ -343,10 +335,8 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        ulong   err;
        int     j;
 
-       if (argc < 4) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 4)
+               return CMD_ERR_USAGE;
 
        /*
         * Chip is always specified.
@@ -361,10 +351,8 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        for (j = 0; j < 8; j++) {
                if (argv[2][j] == '.') {
                        alen = argv[2][j+1] - '0';
-                       if (alen > 4) {
-                               cmd_usage(cmdtp);
-                               return 1;
-                       }
+                       if (alen > 4)
+                               return CMD_ERR_USAGE;
                        break;
                } else if (argv[2][j] == '\0')
                        break;
@@ -415,10 +403,8 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int 
argc, char *argv[])
        int     j;
        extern char console_buffer[];
 
-       if (argc != 3) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc != 3)
+               return CMD_ERR_USAGE;
 
 #ifdef CONFIG_BOOT_RETRY_TIME
        reset_cmd_timeout();    /* got a good command to get here */
@@ -451,10 +437,8 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int 
argc, char *argv[])
                for (j = 0; j < 8; j++) {
                        if (argv[2][j] == '.') {
                                alen = argv[2][j+1] - '0';
-                               if (alen > 4) {
-                                       cmd_usage(cmdtp);
-                                       return 1;
-                               }
+                               if (alen > 4)
+                                       return CMD_ERR_USAGE;
                                break;
                        } else if (argv[2][j] == '\0')
                                break;
@@ -589,10 +573,8 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        int     delay;
        int     j;
 
-       if (argc < 3) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 3)
+               return CMD_ERR_USAGE;
 
        /*
         * Chip is always specified.
@@ -607,10 +589,8 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
        for (j = 0; j < 8; j++) {
                if (argv[2][j] == '.') {
                        alen = argv[2][j+1] - '0';
-                       if (alen > 4) {
-                               cmd_usage(cmdtp);
-                               return 1;
-                       }
+                       if (alen > 4)
+                               return CMD_ERR_USAGE;
                        break;
                } else if (argv[2][j] == '\0')
                        break;
@@ -752,10 +732,9 @@ int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char 
*argv[])
                "32 MiB", "16 MiB", "8 MiB", "4 MiB"
        };
 
-       if (argc < 2) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 2)
+               return CMD_ERR_USAGE;
+
        /*
         * Chip is always specified.
         */
@@ -1244,6 +1223,9 @@ int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int 
argc, char *argv[])
 
 int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
+       if (argc > 6)
+               return CMD_ERR_USAGE;
+
        /* Strip off leading 'i2c' command argument */
        argc--;
        argv++;
@@ -1280,14 +1262,13 @@ int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char 
*argv[])
        if (!strncmp(argv[0], "sd", 2))
                return do_sdram(cmdtp, flag, argc, argv);
 #endif
-       cmd_usage(cmdtp);
-       return 0;
+       return CMD_ERR_USAGE;
 }
 
 /***************************************************/
 
 U_BOOT_CMD(
-       i2c, 6, 1, do_i2c,
+       i2c, 1, do_i2c,
        "I2C sub-system",
        "speed [speed] - show or set I2C bus speed\n"
 #if defined(CONFIG_I2C_MUX)
diff --git a/common/hush.c b/common/hush.c
index 1837a7f..682846e 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -1693,12 +1693,6 @@ static int run_pipe_real(struct pipe *pi)
                                        flag |= CMD_FLAG_BOOTD;
                                }
 #endif
-                               /* found - check max args */
-                               if (cmdtp->maxargs &&
-                                   (child->argc - i) > cmdtp->maxargs) {
-                                       cmd_usage(cmdtp);
-                                       return -1;
-                               }
 #endif
                                child->argv+=i;  /* XXX horrible hack */
 #ifndef __U_BOOT__
@@ -1711,7 +1705,8 @@ static int run_pipe_real(struct pipe *pi)
                                if ( !cmdtp->repeatable )
                                        flag_repeat = 0;
 
-
+                               if (rcode == CMD_ERR_USAGE)
+                                       cmd_usage(cmdtp);
 #endif
                                child->argv-=i;  /* XXX restore hack so free() 
can work right */
 #ifndef __U_BOOT__
@@ -3628,7 +3623,7 @@ int do_showvar (cmd_tbl_t *cmdtp, int flag, int argc, 
char *argv[])
 }
 
 U_BOOT_CMD(
-       showvar, 0, 1,  do_showvar,
+       showvar, 1,     do_showvar,
        "print local hushshell variables",
        "\n    - print values of all hushshell variables\n"
        "showvar name ...\n"
diff --git a/common/kgdb.c b/common/kgdb.c
index ac47c59..0152eec 100644
--- a/common/kgdb.c
+++ b/common/kgdb.c
@@ -593,7 +593,7 @@ do_kgdb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 }
 
 U_BOOT_CMD(
-       kgdb, 0, 1,     do_kgdb,
+       kgdb, 1,        do_kgdb,
        "enter gdb remote debug mode",
        "[arg0 arg1 .. argN]\n"
        "    - executes a breakpoint so that kgdb mode is\n"
diff --git a/common/lcd.c b/common/lcd.c
index db799db..e1643b5 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -348,6 +348,9 @@ int drv_lcd_init (void)
 /*----------------------------------------------------------------------*/
 static int lcd_clear (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
+       if (argc > 1)
+               return CMD_ERR_USAGE;
+
 #if LCD_BPP == LCD_MONOCHROME
        /* Setting the palette */
        lcd_initcolregs();
@@ -392,7 +395,7 @@ static int lcd_clear (cmd_tbl_t * cmdtp, int flag, int 
argc, char *argv[])
 }
 
 U_BOOT_CMD(
-       cls,    1,      1,      lcd_clear,
+       cls,    1,      lcd_clear,
        "clear screen",
        ""
 );
diff --git a/common/main.c b/common/main.c
index 64ec072..340478c 100644
--- a/common/main.c
+++ b/common/main.c
@@ -1396,13 +1396,6 @@ int run_command (const char *cmd, int flag)
                        continue;
                }
 
-               /* found - check max args */
-               if (cmdtp->maxargs && argc > cmdtp->maxargs) {
-                       cmd_usage(cmdtp);
-                       rc = -1;
-                       continue;
-               }
-
 #if defined(CONFIG_CMD_BOOTD)
                /* avoid "bootd" recursion */
                if (cmdtp->cmd == do_bootd) {
@@ -1420,7 +1413,11 @@ int run_command (const char *cmd, int flag)
 #endif
 
                /* OK - call function to do the command */
-               if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
+               rc = (cmdtp->cmd) (cmdtp, flag, argc, argv);
+               if (rc == CMD_ERR_USAGE)
+                       cmd_usage(cmdtp);
+
+               if (rc != 0) {
                        rc = -1;
                }
 
@@ -1443,10 +1440,8 @@ int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char 
*argv[])
 {
        int i;
 
-       if (argc < 2) {
-               cmd_usage(cmdtp);
-               return 1;
-       }
+       if (argc < 2)
+               return CMD_ERR_USAGE;
 
        for (i=1; i<argc; ++i) {
                char *arg;
diff --git a/include/command.h b/include/command.h
index 725df9f..833682e 100644
--- a/include/command.h
+++ b/include/command.h
@@ -45,7 +45,6 @@
 
 struct cmd_tbl_s {
        char            *name;          /* Command Name                 */
-       unsigned int    maxargs;        /* maximum number of arguments  */
        int             repeatable;     /* autorepeat allowed?          */
                                        /* Implementation function      */
        int             (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
@@ -105,23 +104,28 @@ extern int cmd_get_data_size(char* arg, int default_size);
 #define CMD_FLAG_REPEAT                0x0001  /* repeat last command          
*/
 #define CMD_FLAG_BOOTD         0x0002  /* command is from bootd        */
 
+/*
+ * Command Errors:
+ */
+#define CMD_ERR_USAGE          256
+
 #define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))
 
 #ifdef  CONFIG_SYS_LONGHELP
 
-#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
-cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, 
usage, help}
+#define U_BOOT_CMD(name,rep,cmd,usage,help) \
+cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, rep, cmd, usage, help}
 
-#define U_BOOT_CMD_MKENT(name,maxargs,rep,cmd,usage,help) \
-{#name, maxargs, rep, cmd, usage, help}
+#define U_BOOT_CMD_MKENT(name,rep,cmd,usage,help) \
+{#name, rep, cmd, usage, help}
 
 #else  /* no long help info */
 
-#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
-cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, 
usage}
+#define U_BOOT_CMD(name,rep,cmd,usage,help) \
+cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, rep, cmd, usage}
 
-#define U_BOOT_CMD_MKENT(name,maxargs,rep,cmd,usage,help) \
-{#name, maxargs, rep, cmd, usage}
+#define U_BOOT_CMD_MKENT(name,rep,cmd,usage,help) \
+{#name, rep, cmd, usage}
 
 #endif /* CONFIG_SYS_LONGHELP */
 
-- 
1.6.0.4

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

Reply via email to