From b243bb4bb79d022c72184035b2962a5e1b06966f Mon Sep 17 00:00:00 2001 From: Michael Rash Date: Fri, 11 Apr 2014 22:45:27 -0400 Subject: [PATCH] [client] fix minor memory leak before exit() in parsing invalid time offsets --- client/config_init.c | 48 +++++++++++++++++++++------------- test/tests/basic_operations.pl | 4 +-- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/client/config_init.c b/client/config_init.c index 811da4e2..916f00ff 100644 --- a/client/config_init.c +++ b/client/config_init.c @@ -726,13 +726,12 @@ keys_status(fko_cli_options_t *options) /* Parse any time offset from the command line */ static int -parse_time_offset(const char *offset_str) +parse_time_offset(const char *offset_str, int *offset) { int i, j; - int offset = 0; int offset_type = TIME_OFFSET_SECONDS; int os_len = strlen(offset_str); - int is_err; + int is_err = 0; char offset_digits[MAX_TIME_STR_LEN] = {0}; @@ -743,8 +742,7 @@ parse_time_offset(const char *offset_str) j++; if(j >= MAX_TIME_STR_LEN) { - log_msg(LOG_VERBOSITY_ERROR, "Invalid time offset: %s", offset_str); - exit(EXIT_FAILURE); + return 0; } } else if (offset_str[i] == 'm' || offset_str[i] == 'M') { offset_type = TIME_OFFSET_MINUTES; @@ -760,19 +758,17 @@ parse_time_offset(const char *offset_str) offset_digits[j] = '\0'; - if (j < 1) { - log_msg(LOG_VERBOSITY_ERROR, "Invalid time offset: %s", offset_str); - exit(EXIT_FAILURE); - } + if (j < 1) + return 0; - offset = strtol_wrapper(offset_digits, 0, (2 << 15), - EXIT_UPON_ERR, &is_err); + *offset = strtol_wrapper(offset_digits, 0, (2 << 15), + NO_EXIT_UPON_ERR, &is_err); - /* Apply the offset_type value + /* Apply the offset_type multiplier */ - offset *= offset_type; + *offset *= offset_type; - return offset; + return is_err == 0 ? 1 : 0; } static int @@ -971,10 +967,16 @@ parse_rc_param(fko_cli_options_t *options, const char *var_name, char * val) if(val[0] == '-') { val++; - options->time_offset_minus = parse_time_offset(val); + if(! parse_time_offset(val, &options->time_offset_minus)) + parse_error = -1; } else - options->time_offset_plus = parse_time_offset(val); + if (! parse_time_offset(val, &options->time_offset_plus)) + parse_error = -1; + + if(parse_error == -1) + log_msg(LOG_VERBOSITY_WARNING, + "TIME_OFFSET argument '%s' invalid.", val); } /* symmetric encryption mode */ else if (var->pos == FWKNOP_CLI_ARG_ENCRYPTION_MODE) @@ -2246,11 +2248,21 @@ config_init(fko_cli_options_t *options, int argc, char **argv) add_var_to_bitmask(FWKNOP_CLI_ARG_NAT_PORT, &var_bitmask); break; case TIME_OFFSET_PLUS: - options->time_offset_plus = parse_time_offset(optarg); + if (! parse_time_offset(optarg, &options->time_offset_plus)) + { + log_msg(LOG_VERBOSITY_WARNING, + "Invalid time offset: '%s'", optarg); + exit(EXIT_FAILURE); + } add_var_to_bitmask(FWKNOP_CLI_ARG_TIME_OFFSET, &var_bitmask); break; case TIME_OFFSET_MINUS: - options->time_offset_minus = parse_time_offset(optarg); + if (! parse_time_offset(optarg, &options->time_offset_minus)) + { + log_msg(LOG_VERBOSITY_WARNING, + "Invalid time offset: '%s'", optarg); + exit(EXIT_FAILURE); + } add_var_to_bitmask(FWKNOP_CLI_ARG_TIME_OFFSET, &var_bitmask); break; case USE_HMAC: diff --git a/test/tests/basic_operations.pl b/test/tests/basic_operations.pl index 8e93e447..fd843257 100644 --- a/test/tests/basic_operations.pl +++ b/test/tests/basic_operations.pl @@ -1414,7 +1414,7 @@ 'vars' => {'KEY' => 'testtest', 'DIGEST_TYPE' => 'SHA1', 'TIME_OFFSET' => 'invalid'}}], 'exec_err' => $YES, - 'positive_output_matches' => [qr/Invalid/], + 'positive_output_matches' => [qr/Parameter\serror/], 'rc_positive_output_matches' => [qr/TIME_OFFSET.*invalid/], }, { @@ -1427,7 +1427,7 @@ 'vars' => {'KEY' => 'testtest', 'DIGEST_TYPE' => 'SHA1', 'TIME_OFFSET' => '123456789999'}}], 'exec_err' => $YES, - 'positive_output_matches' => [qr/Invalid/], + 'positive_output_matches' => [qr/Parameter\serror/], 'rc_positive_output_matches' => [qr/TIME_OFFSET.*123456789999/], },