From ca90a4b48bb21030b97356912ff950665f17d80f Mon Sep 17 00:00:00 2001 From: Carol Hebert Date: Thu, 15 Jan 2009 19:54:05 +0000 Subject: [PATCH] Jan Safranek 1/15/09 sol set parm range checking patch based on Vince Worthington's 8/8/07 patch --- ipmitool/include/ipmitool/ipmi_sol.h | 18 +++++++++ ipmitool/lib/ipmi_sol.c | 56 ++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_sol.h b/ipmitool/include/ipmitool/ipmi_sol.h index af2bf5f..6e6c0b2 100644 --- a/ipmitool/include/ipmitool/ipmi_sol.h +++ b/ipmitool/include/ipmitool/ipmi_sol.h @@ -81,6 +81,24 @@ struct activate_payload_rsp { #pramga pack(0) #endif +/* + * Small function to validate that user-supplied SOL + * configuration parameter values we store in uint8_t + * data type falls within valid range. With minval + * and maxval parameters we can use the same function + * to validate parameters that have different ranges + * of values. + * + * function will return -1 if value is not valid, or + * will return 0 if valid. + */ +int ipmi_sol_set_param_isvalid_uint8_t( const char *strval, + const char *name, + int base, + uint8_t minval, + uint8_t maxval, + uint8_t *out_value); + int ipmi_sol_main(struct ipmi_intf *, int, char **); int ipmi_get_sol_info(struct ipmi_intf * intf, uint8_t channel, diff --git a/ipmitool/lib/ipmi_sol.c b/ipmitool/lib/ipmi_sol.c index 12e0453..c2689a6 100644 --- a/ipmitool/lib/ipmi_sol.c +++ b/ipmitool/lib/ipmi_sol.c @@ -632,6 +632,42 @@ ipmi_print_sol_info(struct ipmi_intf * intf, uint8_t channel) +/* + * Small function to validate that user-supplied SOL + * configuration parameter values we store in uint8_t + * data type falls within valid range. With minval + * and maxval parameters we can use the same function + * to validate parameters that have different ranges + * of values. + * + * function will return -1 if value is not valid, or + * will return 0 if valid. + */ +int ipmi_sol_set_param_isvalid_uint8_t( const char *strval, + const char *name, + int base, + uint8_t minval, + uint8_t maxval, + uint8_t *out_value) +{ + char *end; + long val = strtol(strval, &end, base); + + if ((val < minval) + || (val > maxval) + || (*end != '\0')) { + lprintf(LOG_ERR, "Invalid value %s for parameter %s", + strval, name); + lprintf(LOG_ERR, "Valid values are %d-%d", minval, maxval); + return -1; + } + else { + *out_value = val; + return 0; + } +} + + /* * ipmi_sol_set_param * @@ -829,7 +865,10 @@ ipmi_sol_set_param(struct ipmi_intf * intf, req.msg.data_len = 4; data[1] = SOL_PARAMETER_CHARACTER_INTERVAL; - data[2] = (uint8_t)strtol(value, NULL, 0); + + /* validate user-supplied input */ + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 1, 255, &data[2])) + return -1; /* We need other values to complete the request */ if (ipmi_get_sol_info(intf, channel, ¶ms)) @@ -852,7 +891,10 @@ ipmi_sol_set_param(struct ipmi_intf * intf, req.msg.data_len = 4; data[1] = SOL_PARAMETER_CHARACTER_INTERVAL; - data[3] = (uint8_t)strtol(value, NULL, 0); + + /* validate user-supplied input */ + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 255, &data[3])) + return -1; /* We need other values to complete the request */ if (ipmi_get_sol_info(intf, channel, ¶ms)) @@ -875,7 +917,10 @@ ipmi_sol_set_param(struct ipmi_intf * intf, req.msg.data_len = 4; data[1] = SOL_PARAMETER_SOL_RETRY; - data[2] = (uint8_t)strtol(value, NULL, 0) & 0x07; + + /* validate user input, 7 is max value */ + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 7, &data[2])) + return -1; /* We need other values to complete the request */ if (ipmi_get_sol_info(intf, channel, ¶ms)) @@ -898,7 +943,10 @@ ipmi_sol_set_param(struct ipmi_intf * intf, req.msg.data_len = 4; data[1] = SOL_PARAMETER_SOL_RETRY; - data[3] = (uint8_t)strtol(value, NULL, 0); + + /* validate user-supplied input */ + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 255, &data[3])) + return -1; /* We need other values to complete the request */ if (ipmi_get_sol_info(intf, channel, ¶ms))