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