diff --git a/askama_derive/src/generator/expr.rs b/askama_derive/src/generator/expr.rs index a3a114a6..ea25a612 100644 --- a/askama_derive/src/generator/expr.rs +++ b/askama_derive/src/generator/expr.rs @@ -786,7 +786,10 @@ impl<'a> Generator<'a, '_> { quote_into!(buf, span, { #this #generics }); continue; } - buf.write_field(part, span); + if i != 0 || !part.is_empty() { + // Paths can start with `::`, meaning we can have an empty identifier first. + buf.write_field(part, span); + } } } diff --git a/fuzzing/fuzz/artifacts/derive/clusterfuzz-testcase-minimized-derive-6639137261420544 b/fuzzing/fuzz/artifacts/derive/clusterfuzz-testcase-minimized-derive-6639137261420544 new file mode 100644 index 00000000..844a34e1 --- /dev/null +++ b/fuzzing/fuzz/artifacts/derive/clusterfuzz-testcase-minimized-derive-6639137261420544 @@ -0,0 +1 @@ +ÿÿÿ{{::s!()}}ÿ ÿtÿ \ No newline at end of file diff --git a/testing/tests/path.rs b/testing/tests/path.rs new file mode 100644 index 00000000..49856c71 --- /dev/null +++ b/testing/tests/path.rs @@ -0,0 +1,11 @@ +use askama::Template; + +// Ensure that paths starting with `::` are supported correctly. +#[test] +fn test_path_starting_with_colon() { + #[derive(Template)] + #[template(source = r#"���{{::std::format!("")}}� �t�"#, ext = "txt")] + struct X; + + assert_eq!(X.render().unwrap(), "���� �t�"); +}