diff --git a/src/libflake-tests/flakeref.cc b/src/libflake-tests/flakeref.cc index eb8b56ea2..5fcbbc9c3 100644 --- a/src/libflake-tests/flakeref.cc +++ b/src/libflake-tests/flakeref.cc @@ -283,4 +283,18 @@ TEST(to_string, doesntReencodeUrl) ASSERT_EQ(unparsed, expected); } +TEST(parseFlakeRef, malformedGithubUrlDoesNotCrash) +{ + experimentalFeatureSettings.experimentalFeatures.get().insert(Xp::Flakes); + + fetchers::Settings fetchSettings; + + // Using ref= instead of rev= with a github: URL should produce an + // error, not an assertion failure in renderAuthorityAndPath + // (https://github.com/NixOS/nix/issues/15196). + EXPECT_THROW( + parseFlakeRef(fetchSettings, "github:nixos/nixpkgs/nixpkgs.git?ref=aead170c1a49253ebfa5027010dfd89a77b73ca4"), + Error); +} + } // namespace nix diff --git a/src/libflake/flakeref.cc b/src/libflake/flakeref.cc index 0a55ac35c..f3bfb9527 100644 --- a/src/libflake/flakeref.cc +++ b/src/libflake/flakeref.cc @@ -205,7 +205,7 @@ std::pair parsePathFlakeRefWithFragment( fetchSettings, { .scheme = "path", - .authority = ParsedURL::Authority{}, + .authority = isAbsolute(path) ? std::optional{ParsedURL::Authority{}} : std::nullopt, .path = splitString>(path, "/"), .query = query, .fragment = fragment,