Check the channel where possible. I've looked for 'channel' in ipmitool
manpage to find the occurences, I hope I got all of them.

Signed-off-by: Jan Safranek <jsafr...@redhat.com>
---

 include/ipmitool/helper.h |    1 +
 lib/helper.c              |   17 +++++++++++++++++
 lib/ipmi_channel.c        |   20 ++++++++++++++------
 lib/ipmi_firewall.c       |    8 ++++++--
 lib/ipmi_lanp.c           |   27 ++++++++++-----------------
 lib/ipmi_raw.c            |    3 ++-
 lib/ipmi_sol.c            |   14 ++++++++++----
 lib/ipmi_user.c           |   15 +++++++++++----
 8 files changed, 71 insertions(+), 34 deletions(-)

diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h
index b586ec3..ee0bfbf 100644
--- a/include/ipmitool/helper.h
+++ b/include/ipmitool/helper.h
@@ -78,6 +78,7 @@ FILE * ipmi_open_file(const char * file, int rw);
 void ipmi_start_daemon(struct ipmi_intf *intf);
 
 int parse_user(const char *arg, uint8_t *user);
+int parse_channel(const char *arg, uint8_t *channel);
 
 #define ipmi_open_file_read(file)      ipmi_open_file(file, 0)
 #define ipmi_open_file_write(file)     ipmi_open_file(file, 1)
diff --git a/lib/helper.c b/lib/helper.c
index db2884d..b084143 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -455,3 +455,20 @@ int parse_user(const char *arg, uint8_t *user)
        *user = val;
        return 0;
 }
+
+int parse_channel(const char *arg, uint8_t *channel)
+{
+       char *end;
+       unsigned long val;
+       errno = 0;
+
+       val = strtoul(arg, &end, 0);
+       /* Channel is 4-bit integer. */
+       if (errno != 0 || *end != '\0' || val > 0xf) {
+               lprintf(LOG_ERR, "Invalid channel: %s\n", arg);
+               return -1;
+       }
+
+       *channel = val;
+       return 0;
+}
diff --git a/lib/ipmi_channel.c b/lib/ipmi_channel.c
index 0920162..27ee0c7 100644
--- a/lib/ipmi_channel.c
+++ b/lib/ipmi_channel.c
@@ -451,7 +451,8 @@ ipmi_set_user_access(struct ipmi_intf * intf, int argc, 
char ** argv)
                 return 0;
         }
 
-       channel = (uint8_t)strtol(argv[0], NULL, 0);
+       if (parse_channel(argv[0], &channel) != 0)
+               return -1;
 
        if (parse_user(argv[1], &userid) != 0)
                return -1;
@@ -808,20 +809,26 @@ ipmi_channel_main(struct ipmi_intf * intf, int argc, char 
** argv)
        }
        else if (strncmp(argv[0], "authcap", 7) == 0)
        {
+               uint8_t channel;
                if (argc != 3)
                        printf_channel_usage();
-               else
-                       retval = ipmi_get_channel_auth_cap(intf,
-                                               (uint8_t)strtol(argv[1], NULL, 
0),
+               else {
+                       if (parse_channel(argv[1], &channel) != 0)
+                               retval  = -1;
+                       else
+                               retval = ipmi_get_channel_auth_cap(intf, 
channel,
                                                (uint8_t)strtol(argv[2], NULL, 
0));
+               }
        }
        else if (strncmp(argv[0], "getaccess", 10) == 0)
        {
                if ((argc < 2) || (argc > 3))
                        printf_channel_usage();
                else {
-                       uint8_t ch = (uint8_t)strtol(argv[1], NULL, 0);
+                       uint8_t ch;
                        uint8_t id = 0;
+                       if (parse_channel(argv[1], &ch) != 0)
+                               return -1;
                        if (argc == 3)
                                if (parse_user(argv[2], &id) != 0)
                                        return -1;
@@ -839,7 +846,8 @@ ipmi_channel_main(struct ipmi_intf * intf, int argc, char 
** argv)
                else {
                        uint8_t ch = 0xe;
                        if (argc == 2)
-                               ch = (uint8_t)strtol(argv[1], NULL, 0);
+                               if (parse_channel(argv[1], &ch) != 0)
+                                       return -1;
                        retval = ipmi_get_channel_info(intf, ch);
                }
        }
diff --git a/lib/ipmi_firewall.c b/lib/ipmi_firewall.c
index 3e937ea..9c50d08 100644
--- a/lib/ipmi_firewall.c
+++ b/lib/ipmi_firewall.c
@@ -89,8 +89,12 @@ ipmi_firewall_parse_args(int argc, char ** argv, struct 
ipmi_function_params * p
        }
        for (i=0; i<argc; i++) {
                if (strncmp(argv[i], "channel", 7) == 0) {
-                       if (++i < argc)
-                               p->channel = strtol(argv[i], NULL, 0);
+                       if (++i < argc) {
+                               uint8_t channel;
+                               if (parse_channel(argv[i], &channel) != 0)
+                                       return -1;
+                               p->channel = channel;
+                       }
                }
                else if (strncmp(argv[i], "lun", 3) == 0) {
                        if (++i < argc)
diff --git a/lib/ipmi_lanp.c b/lib/ipmi_lanp.c
index 6897bb3..cecf0ff 100644
--- a/lib/ipmi_lanp.c
+++ b/lib/ipmi_lanp.c
@@ -1361,7 +1361,8 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** 
argv)
                return 0;
        }
 
-       chan = (uint8_t)strtol(argv[0], NULL, 0);
+       if (parse_channel(argv[0], &chan) != 0)
+                       return -1;
 
        /* find type of channel and only accept 802.3 LAN */
        if (is_lan_channel(intf, chan) == 0) {
@@ -1944,7 +1945,8 @@ ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** 
argv)
                        return 0;
                }
 
-               channel = (uint8_t)strtol(argv[1], NULL, 0);
+               if (parse_channel(argv[1], &channel) != 0)
+                               return -1;
                if (is_lan_channel(intf, channel) == 0) {
                        lprintf(LOG_ERR, "Channel %d is not a LAN channel", 
channel);
                        return -1;
@@ -2155,14 +2157,9 @@ ipmi_lanp_main(struct ipmi_intf * intf, int argc, char 
** argv)
            strncmp(argv[0], "print", 5) == 0)
        {
                if (argc > 1)
-                       chan = (uint8_t)strtol(argv[1], NULL, 0);
-               if (chan < 1 || chan > IPMI_CHANNEL_NUMBER_MAX)
-               {
-                       lprintf(LOG_ERR, "Invalid channel: %d", chan);
-                       return -1;
-               }
-               else
-                       rc = ipmi_lan_print(intf, chan);
+                       if (parse_channel(argv[1], &chan) != 0)
+                               return -1;
+               rc = ipmi_lan_print(intf, chan);
        }
        else if (strncmp(argv[0], "set", 3) == 0)
        {
@@ -2180,14 +2177,10 @@ ipmi_lanp_main(struct ipmi_intf * intf, int argc, char 
** argv)
                        return -1;
                }
                else if (argc > 2)
-                       chan = (uint8_t)strtol(argv[2], NULL, 0);
+                       if (parse_channel(argv[2], &chan) != 0)
+                                       return -1;
 
-               if (chan < 1 || chan > IPMI_CHANNEL_NUMBER_MAX)
-               {
-                       lprintf(LOG_ERR, "Invalid channel: %d", chan);
-                       return -1;
-               }
-               else if (strncmp(argv[1], "get", 3) == 0)
+               if (strncmp(argv[1], "get", 3) == 0)
                        rc = ipmi_lan_stats_get(intf, chan);
                else if (strncmp(argv[1], "clear", 5) == 0)
                        rc = ipmi_lan_stats_clear(intf, chan);
diff --git a/lib/ipmi_raw.c b/lib/ipmi_raw.c
index c99a57f..c707990 100644
--- a/lib/ipmi_raw.c
+++ b/lib/ipmi_raw.c
@@ -150,7 +150,8 @@ ipmi_rawspd_main(struct ipmi_intf * intf, int argc, char ** 
argv)
        i2cbus  =  (uint8_t)strtoul(argv[0], NULL, 0);
        i2caddr =  (uint8_t)strtoul(argv[1], NULL, 0);
        if( argc >= 3 ){
-               channel = (uint8_t)strtoul(argv[2], NULL, 0);
+               if (parse_channel(argv[2], &channel) != 0)
+                               return -1;
        }
        if( argc >= 4 ){
                msize     =  (uint8_t)strtoul(argv[3], NULL, 0);
diff --git a/lib/ipmi_sol.c b/lib/ipmi_sol.c
index c829395..8c1edf2 100644
--- a/lib/ipmi_sol.c
+++ b/lib/ipmi_sol.c
@@ -1921,7 +1921,10 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** 
argv)
                if (argc == 1)
                        channel = 0x0E; /* Ask about the current channel */
                else if (argc == 2)
-                       channel = (uint8_t)strtol(argv[1], NULL, 0);
+               {
+                       if (parse_channel(argv[1], &channel) != 0)
+                                       return -1;
+               }
                else
                {
                        print_sol_usage();
@@ -1953,7 +1956,8 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** 
argv)
 
                if (argc >= 3)
                {
-                       channel = (uint8_t)strtol(argv[2], NULL, 0);
+                       if (parse_channel(argv[2], &channel) != 0)
+                               return -1;
                }
                if (argc == 4)
                {
@@ -1999,11 +2003,13 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char 
** argv)
                        if (!strncmp(argv[3], "noguard", 7))
                                guard = 0;
                        else
-                               channel = (uint8_t)strtol(argv[3], NULL, 0);
+                               if (parse_channel(argv[3], &channel) != 0)
+                                       return -1;
                }
                else if (argc == 5)
                {
-                       channel = (uint8_t)strtol(argv[3], NULL, 0);
+                       if (parse_channel(argv[3], &channel) != 0)
+                               return -1;
                        if (!strncmp(argv[4], "noguard", 7))
                                guard = 0;
                }
diff --git a/lib/ipmi_user.c b/lib/ipmi_user.c
index 93ce11b..a2589fa 100644
--- a/lib/ipmi_user.c
+++ b/lib/ipmi_user.c
@@ -538,7 +538,10 @@ ipmi_user_main(struct ipmi_intf * intf, int argc, char ** 
argv)
                if (argc == 1)
                        channel = 0x0E; /* Ask about the current channel */
                else if (argc == 2)
-                       channel = (uint8_t)strtol(argv[1], NULL, 0);
+               {
+                       if (parse_channel(argv[1], &channel) != 0)
+                                       return -1;
+               }
                else
                {
                        print_user_usage();
@@ -559,7 +562,11 @@ ipmi_user_main(struct ipmi_intf * intf, int argc, char ** 
argv)
                if (argc == 1)
                        channel = 0x0E; /* Ask about the current channel */
                else if (argc == 2)
-                       channel = (uint8_t)strtol(argv[1], NULL, 0);
+               {
+                       if (parse_channel(argv[1], &channel) != 0)
+                                       return -1;
+
+               }
                else
                {
                        print_user_usage();
@@ -737,8 +744,8 @@ ipmi_user_main(struct ipmi_intf * intf, int argc, char ** 
argv)
                }
                if (argc == 4)
                {
-                       channel = (uint8_t)strtol(argv[3], NULL, 0);
-                       channel = (channel & 0x0f);
+                       if (parse_channel(argv[3], &channel) != 0)
+                                       return -1;
                }
 
                if (parse_user(argv[1], &user_id) != 0)


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to