diff --git a/source/endpoints_regex.c b/source/endpoints_regex.c index 6758ed2..3857c6f 100644 --- a/source/endpoints_regex.c +++ b/source/endpoints_regex.c @@ -144,6 +144,21 @@ struct aws_endpoint_regex *aws_endpoint_regex_new_from_string( goto on_error; } + aws_byte_cursor_advance(®ex_pattern, group.len); + if (regex_pattern.len == 0 || regex_pattern.ptr[0] != ')') { + AWS_LOGF_ERROR( + AWS_LS_SDKUTILS_ENDPOINTS_REGEX, "Invalid regex pattern. Missing closing parenthesis."); + aws_raise_error(AWS_ERROR_INVALID_ARGUMENT); + goto on_error; + } + aws_byte_cursor_advance(®ex_pattern, 1); + + if (group.len == 0) { + AWS_LOGF_ERROR(AWS_LS_SDKUTILS_ENDPOINTS_REGEX, "Invalid regex pattern. Empty group."); + aws_raise_error(AWS_ERROR_INVALID_ARGUMENT); + goto on_error; + } + /* Verify that group is only used for alternation. */ for (size_t i = 0; i < group.len; ++i) { if (!aws_isalnum(group.ptr[i]) && group.ptr[i] != '|') { @@ -157,7 +172,6 @@ struct aws_endpoint_regex *aws_endpoint_regex_new_from_string( symbol.type = AWS_ENDPOINTS_REGEX_SYMBOL_ALTERNATION_GROUP; symbol.info.alternation = aws_string_new_from_cursor(allocator, &group); - aws_byte_cursor_advance(®ex_pattern, group.len + 1); break; } diff --git a/tests/endpoint_regex_tests.c b/tests/endpoint_regex_tests.c index e52e7e0..4883f2b 100644 --- a/tests/endpoint_regex_tests.c +++ b/tests/endpoint_regex_tests.c @@ -79,5 +79,40 @@ static int s_test_misc_regex_validation(struct aws_allocator *allocator, void *c ASSERT_NULL(regex); ASSERT_INT_EQUALS(AWS_ERROR_SDKUTILS_ENDPOINTS_UNSUPPORTED_REGEX, aws_last_error()); + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string( + allocator, aws_byte_cursor_from_c_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("aaaaa")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_SDKUTILS_ENDPOINTS_UNSUPPORTED_REGEX, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("^aaa(aa$")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("^aaaaa($")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("^aaa()aa$")); + ASSERT_NULL(regex); + ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error()); + + regex = aws_endpoint_regex_new_from_string(allocator, aws_byte_cursor_from_c_str("^aaaaa$")); + ASSERT_NOT_NULL(regex); + + ASSERT_ERROR( + AWS_ERROR_INVALID_ARGUMENT, + aws_endpoint_regex_match( + regex, aws_byte_cursor_from_c_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))); + + aws_endpoint_regex_destroy(regex); + return AWS_OP_SUCCESS; } \ No newline at end of file