From 2b510ed2dc6fe28f6bfeb9c92c3c563feb8e6bb2 Mon Sep 17 00:00:00 2001 From: Daijiro Wachi Date: Sat, 3 Jan 2026 15:45:24 +0900 Subject: [PATCH 1/4] fixes overlap for debug mode --- src/url_aggregator.cpp | 19 +++++++++++++++++-- tests/basic_tests.cpp | 9 +++++++++ tests/wpt/ada_extra_urltestdata.json | 15 +++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/url_aggregator.cpp b/src/url_aggregator.cpp index cfa68a466..a9a623f51 100644 --- a/src/url_aggregator.cpp +++ b/src/url_aggregator.cpp @@ -647,16 +647,26 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { return true; } -bool url_aggregator::set_host(const std::string_view input) { +bool url_aggregator::set_host(std::string_view input) { ada_log("url_aggregator::set_host '", input, "'"); ADA_ASSERT_TRUE(validate()); + std::string tmp_buffer; + if (helpers::overlaps(input, buffer)) { + tmp_buffer = input; + input = tmp_buffer; + } ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); return set_host_or_hostname(input); } -bool url_aggregator::set_hostname(const std::string_view input) { +bool url_aggregator::set_hostname(std::string_view input) { ada_log("url_aggregator::set_hostname '", input, "'"); ADA_ASSERT_TRUE(validate()); + std::string tmp_buffer; + if (helpers::overlaps(input, buffer)) { + tmp_buffer = input; + input = tmp_buffer; + } ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); return set_host_or_hostname(input); } @@ -1227,6 +1237,11 @@ bool url_aggregator::parse_ipv6(std::string_view input) { bool url_aggregator::parse_opaque_host(std::string_view input) { ada_log("parse_opaque_host ", input, " [", input.size(), " bytes]"); ADA_ASSERT_TRUE(validate()); + std::string tmp_buffer; + if (helpers::overlaps(input, buffer)) { + tmp_buffer = input; + input = tmp_buffer; + } ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); if (std::ranges::any_of(input, ada::unicode::is_forbidden_host_code_point)) { return is_valid = false; diff --git a/tests/basic_tests.cpp b/tests/basic_tests.cpp index 579a0c5d7..c3a731645 100644 --- a/tests/basic_tests.cpp +++ b/tests/basic_tests.cpp @@ -56,6 +56,15 @@ TYPED_TEST(basic_tests, pluses) { SUCCEED(); } +TYPED_TEST(basic_tests, overlap_test) { + auto url = ada::parse("http://example.com/very_long_path_string"); + ASSERT_TRUE(url); + // This triggers assertion failure in debug mode for url_aggregator + // because get_pathname() returns a view into the buffer, and set_hostname() modifies it. + url->set_hostname(url->get_pathname()); + SUCCEED(); +} + TYPED_TEST(basic_tests, set_host_should_return_false_sometimes) { auto r = ada::parse("mailto:a@b.com"); ASSERT_FALSE(r->set_host("something")); diff --git a/tests/wpt/ada_extra_urltestdata.json b/tests/wpt/ada_extra_urltestdata.json index 93cc0870c..0fac86713 100644 --- a/tests/wpt/ada_extra_urltestdata.json +++ b/tests/wpt/ada_extra_urltestdata.json @@ -285,5 +285,20 @@ "pathname": "b/", "search": "", "hash": "" + }, + { + "input": "http://user:pass@1.2.3.4", + "base": "about:blank", + "href": "http://user:pass@1.2.3.4/", + "origin": "http://1.2.3.4", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "1.2.3.4", + "hostname": "1.2.3.4", + "port": "", + "pathname": "/", + "search": "", + "hash": "" } ] From 55e66c9deb45ad0b04c10f4dcb4e121ec636dbad Mon Sep 17 00:00:00 2001 From: Daijiro Wachi Date: Sat, 3 Jan 2026 15:45:30 +0900 Subject: [PATCH 2/4] add debug mode ci --- .github/workflows/ubuntu-debug.yml | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/ubuntu-debug.yml diff --git a/.github/workflows/ubuntu-debug.yml b/.github/workflows/ubuntu-debug.yml new file mode 100644 index 000000000..1b80e8cb4 --- /dev/null +++ b/.github/workflows/ubuntu-debug.yml @@ -0,0 +1,44 @@ +name: Ubuntu 22.04 Debug + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + paths-ignore: + - '**.md' + - 'docs/**' + push: + branches: + - main + paths-ignore: + - '**.md' + - 'docs/**' + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ubuntu-build-debug: + strategy: + fail-fast: false + matrix: + shared: [OFF] + cxx: [g++-12, clang++-15] + runs-on: [ubuntu-22.04] + simdutf: [OFF, ON] + runs-on: ${{matrix.runs-on}} + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - name: Setup Ninja + run: sudo apt-get install ninja-build + - name: Prepare + run: cmake -DCMAKE_BUILD_TYPE=Debug -D ADA_TESTING=ON -D ADA_BENCHMARKS=ON -DBUILD_SHARED_LIBS=${{matrix.shared}} -D ADA_USE_SIMDUTF=${{matrix.simdutf}} -G Ninja -B build + env: + CXX: ${{matrix.cxx}} + - name: Build + run: cmake --build build -j=4 + - name: Test + run: ctest --output-on-failure --test-dir build From a7a7dae79b2cea752332eab527c5ea3cf91d6361 Mon Sep 17 00:00:00 2001 From: Daijiro Wachi Date: Sat, 3 Jan 2026 15:52:56 +0900 Subject: [PATCH 3/4] fix clang-format --- tests/basic_tests.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/basic_tests.cpp b/tests/basic_tests.cpp index c3a731645..cfe7f1fca 100644 --- a/tests/basic_tests.cpp +++ b/tests/basic_tests.cpp @@ -60,7 +60,8 @@ TYPED_TEST(basic_tests, overlap_test) { auto url = ada::parse("http://example.com/very_long_path_string"); ASSERT_TRUE(url); // This triggers assertion failure in debug mode for url_aggregator - // because get_pathname() returns a view into the buffer, and set_hostname() modifies it. + // because get_pathname() returns a view into the buffer, and set_hostname() + // modifies it. url->set_hostname(url->get_pathname()); SUCCEED(); } From 5f2f0c5cee0969ab31c412f2395826ff16944175 Mon Sep 17 00:00:00 2001 From: Daijiro Wachi Date: Sat, 3 Jan 2026 16:58:46 +0900 Subject: [PATCH 4/4] increase timeout for debug mode --- .github/workflows/ubuntu-debug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu-debug.yml b/.github/workflows/ubuntu-debug.yml index 1b80e8cb4..aa7bb9955 100644 --- a/.github/workflows/ubuntu-debug.yml +++ b/.github/workflows/ubuntu-debug.yml @@ -41,4 +41,4 @@ jobs: - name: Build run: cmake --build build -j=4 - name: Test - run: ctest --output-on-failure --test-dir build + run: ctest --output-on-failure --test-dir build --timeout 300