From 47a509cfd36dfac4013f4ee76891165727eb47a1 Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Fri, 16 Oct 2026 06:37:01 -1000 Subject: Trim readme lines in linear time The heading pattern backtracked over a run of spaces in cubic time and the cell trim in quadratic time, so one crafted line in a readme could hold a request for half an hour, well inside the size cap. The heading rule now also keeps a sharp that ends a word, as in "# C#". --- tests/extensions/test-about-render.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'tests/extensions/test-about-render.lua') diff --git a/tests/extensions/test-about-render.lua b/tests/extensions/test-about-render.lua index 338949a..b0379b7 100644 --- a/tests/extensions/test-about-render.lua +++ b/tests/extensions/test-about-render.lua @@ -73,6 +73,9 @@ h.contains("a heading renders inside the wrapper", out, "
< out = render("README.md", "## Sub ##") h.contains("trailing hashes are stripped from a heading", out, "

Sub

") +out = render("README.md", "# C#") +h.contains("a hash ending a word stays in the heading", out, "

C#

") + out = render("README.MD", "# Upper") h.contains("the extension matches whatever its case", out, "

Upper

") @@ -160,6 +163,13 @@ h.contains("the innermost text still renders", out, "x") out = render("README.md", string.rep("*a", 200)) h.check("an emphasis bomb still renders something", #out > 0) +-- Trimming a run of spaces must stay linear, or one hostile line holds a +-- request for minutes. Both lines below took seconds before. +local started = os.clock() +render("README.md", "# a" .. string.rep(" ", 3000) .. "b") +render("README.md", "| a | b |\n|---|---|\n| x" .. string.rep(" ", 40000) .. "y | z |") +h.check("a long run of spaces is trimmed quickly", os.clock() - started < 1) + out = render("README.md", "| a | b |\n| --- | --- |\n| 1 | 2 |") h.contains("a pipe table renders its head", out, "ab") h.contains("a pipe table renders its body", out, "12") -- cgit