diff --git a/.changeset/fix-find-matching-bracket-infinite-loop.md b/.changeset/fix-find-matching-bracket-infinite-loop.md new file mode 100644 index 0000000000..c0656ea794 --- /dev/null +++ b/.changeset/fix-find-matching-bracket-infinite-loop.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: prevent infinite loop when a tag's expression ends with a trailing `/` at the end of the input diff --git a/packages/svelte/src/compiler/phases/1-parse/utils/bracket.js b/packages/svelte/src/compiler/phases/1-parse/utils/bracket.js index 567d999a59..47299c9de5 100644 --- a/packages/svelte/src/compiler/phases/1-parse/utils/bracket.js +++ b/packages/svelte/src/compiler/phases/1-parse/utils/bracket.js @@ -107,7 +107,11 @@ export function find_matching_bracket(template, index, open) { continue; case '/': { const next_char = template[i + 1]; - if (!next_char) continue; + if (!next_char) { + // `/` is the last character; advance past it so we don't loop forever + i++; + continue; + } if (next_char === '/') { i = infinity_if_negative(template.indexOf('\n', i + 1)) + '\n'.length; continue; diff --git a/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/_config.js b/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/_config.js new file mode 100644 index 0000000000..2e605631c5 --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/_config.js @@ -0,0 +1,11 @@ +import { test } from '../../test'; + +// A tag whose expression ends with a bare `/` at the end of the input used to +// make `find_matching_bracket` loop forever; it should error instead of hanging. +export default test({ + error: { + code: 'unexpected_eof', + message: 'Unexpected end of input', + position: [12, 12] + } +}); diff --git a/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/main.svelte b/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/main.svelte new file mode 100644 index 0000000000..8ffdb88a18 --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/declaration-tag-trailing-slash/main.svelte @@ -0,0 +1 @@ +{let x = a / \ No newline at end of file