From e998da70e4f6964689d94bdcea21d2b37c069e5e Mon Sep 17 00:00:00 2001 From: Carlos Sousa Date: Thu, 9 Jan 2025 22:09:10 -0300 Subject: [PATCH 1/3] fix set_port when input is 'invalid80' --- include/ada/url-inl.h | 7 +++++++ include/ada/url_aggregator-inl.h | 7 +++++++ tests/basic_tests.cpp | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/include/ada/url-inl.h b/include/ada/url-inl.h index f2ff0160d..9415c40e0 100644 --- a/include/ada/url-inl.h +++ b/include/ada/url-inl.h @@ -231,6 +231,13 @@ ada_really_inline size_t url::parse_port(std::string_view view, is_valid = false; return 0; } + + if(parsed_port < 1) { + ada_log("parse_port: port out of valid range (1-65535)"); + is_valid = false; + return 0; + } + ada_log("parse_port: ", parsed_port); const auto consumed = size_t(r.ptr - view.data()); ada_log("parse_port: consumed ", consumed); diff --git a/include/ada/url_aggregator-inl.h b/include/ada/url_aggregator-inl.h index 2012b79d4..e8bcdfafc 100644 --- a/include/ada/url_aggregator-inl.h +++ b/include/ada/url_aggregator-inl.h @@ -862,6 +862,13 @@ ada_really_inline size_t url_aggregator::parse_port( is_valid = false; return 0; } + + if(parsed_port < 1) { + ada_log("parse_port: port out of valid range (1-65535)"); + is_valid = false; + return 0; + } + ada_log("parse_port: ", parsed_port); const size_t consumed = size_t(r.ptr - view.data()); ada_log("parse_port: consumed ", consumed); diff --git a/tests/basic_tests.cpp b/tests/basic_tests.cpp index d1d452a42..e83251f5e 100644 --- a/tests/basic_tests.cpp +++ b/tests/basic_tests.cpp @@ -462,4 +462,11 @@ TYPED_TEST(basic_tests, negativeport) { auto url = ada::parse("https://www.google.com"); ASSERT_FALSE(url->set_port("-1")); SUCCEED(); +} + +TYPED_TEST(basic_tests, negativeport_and_its_return) { + auto url = ada::parse("fake://dummy.test"); + ASSERT_FALSE(url->set_port("invalid80")); + ASSERT_TRUE(url->is_valid); + SUCCEED(); } \ No newline at end of file From b46019389f67b7f74ab8b8e246737decfc33a8b3 Mon Sep 17 00:00:00 2001 From: Carlos Sousa Date: Thu, 9 Jan 2025 23:04:26 -0300 Subject: [PATCH 2/3] change approach, verify input before parse_port --- include/ada/url-inl.h | 7 ------- include/ada/url_aggregator-inl.h | 7 ------- src/url.cpp | 7 +++++++ src/url_aggregator.cpp | 7 +++++++ tests/basic_tests.cpp | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/ada/url-inl.h b/include/ada/url-inl.h index 9415c40e0..f2ff0160d 100644 --- a/include/ada/url-inl.h +++ b/include/ada/url-inl.h @@ -231,13 +231,6 @@ ada_really_inline size_t url::parse_port(std::string_view view, is_valid = false; return 0; } - - if(parsed_port < 1) { - ada_log("parse_port: port out of valid range (1-65535)"); - is_valid = false; - return 0; - } - ada_log("parse_port: ", parsed_port); const auto consumed = size_t(r.ptr - view.data()); ada_log("parse_port: consumed ", consumed); diff --git a/include/ada/url_aggregator-inl.h b/include/ada/url_aggregator-inl.h index e8bcdfafc..2012b79d4 100644 --- a/include/ada/url_aggregator-inl.h +++ b/include/ada/url_aggregator-inl.h @@ -862,13 +862,6 @@ ada_really_inline size_t url_aggregator::parse_port( is_valid = false; return 0; } - - if(parsed_port < 1) { - ada_log("parse_port: port out of valid range (1-65535)"); - is_valid = false; - return 0; - } - ada_log("parse_port: ", parsed_port); const size_t consumed = size_t(r.ptr - view.data()); ada_log("parse_port: consumed ", consumed); diff --git a/src/url.cpp b/src/url.cpp index f35625bed..cf870ca06 100644 --- a/src/url.cpp +++ b/src/url.cpp @@ -791,6 +791,13 @@ bool url::set_port(const std::string_view input) { return false; } + uint16_t parsed_port{}; + auto r = std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), + parsed_port); + if (parsed_port < 1) { + return false; + } + // Revert changes if parse_port fails. std::optional previous_port = port; parse_port(trimmed); diff --git a/src/url_aggregator.cpp b/src/url_aggregator.cpp index 08211436d..a4db71262 100644 --- a/src/url_aggregator.cpp +++ b/src/url_aggregator.cpp @@ -294,6 +294,13 @@ bool url_aggregator::set_port(const std::string_view input) { return false; } + uint16_t parsed_port{}; + auto r = std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), + parsed_port); + if (parsed_port < 1) { + return false; + } + // Revert changes if parse_port fails. uint32_t previous_port = components.port; parse_port(trimmed); diff --git a/tests/basic_tests.cpp b/tests/basic_tests.cpp index e83251f5e..255b96ab1 100644 --- a/tests/basic_tests.cpp +++ b/tests/basic_tests.cpp @@ -469,4 +469,4 @@ TYPED_TEST(basic_tests, negativeport_and_its_return) { ASSERT_FALSE(url->set_port("invalid80")); ASSERT_TRUE(url->is_valid); SUCCEED(); -} \ No newline at end of file +} From 7cbd2cae5a3f42c4c6e76212c48b6118d3ba635a Mon Sep 17 00:00:00 2001 From: Carlos Sousa Date: Thu, 9 Jan 2025 23:11:48 -0300 Subject: [PATCH 3/3] remove unused variable --- src/url.cpp | 3 +-- src/url_aggregator.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/url.cpp b/src/url.cpp index cf870ca06..29416d8df 100644 --- a/src/url.cpp +++ b/src/url.cpp @@ -792,8 +792,7 @@ bool url::set_port(const std::string_view input) { } uint16_t parsed_port{}; - auto r = std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), - parsed_port); + std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), parsed_port); if (parsed_port < 1) { return false; } diff --git a/src/url_aggregator.cpp b/src/url_aggregator.cpp index a4db71262..f1b26b528 100644 --- a/src/url_aggregator.cpp +++ b/src/url_aggregator.cpp @@ -295,8 +295,7 @@ bool url_aggregator::set_port(const std::string_view input) { } uint16_t parsed_port{}; - auto r = std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), - parsed_port); + std::from_chars(trimmed.data(), trimmed.data() + trimmed.size(), parsed_port); if (parsed_port < 1) { return false; }