From 20d84767b72f219277e8c9345d286c8d06b61ffe Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Sat, 7 Nov 2026 12:04:43 -1000 Subject: Pin the listing's blame link for a late NUL The listing judges binary by the first 8000 bytes, as git does, while the blame page and the file view look for a NUL anywhere, since one past that window would end a Lua filter's output early. The listing keeps the cheap sniff, because the whole-blob check would inflate every blob it names, so a file whose NUL lies past the window gets a blame link that ends on "Blob is binary". The test pins that trade, so a change to either side has to face it. --- source/ui-tree.c | 4 ++++ tests/t0104-tree.sh | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/source/ui-tree.c b/source/ui-tree.c index b682f3e..f89498a 100644 --- a/source/ui-tree.c +++ b/source/ui-tree.c @@ -270,6 +270,10 @@ static void print_dir_chain(const struct object_id *oid, const char *name, /* * Whether git counts the blob as binary, read through a stream so that only * the bytes buffer_is_binary looks at are inflated, however large the blob. + * The blame page and the file view also count a NUL anywhere in the blob, so + * a file whose first NUL lies past this window is still offered a blame link + * that leads to "Blob is binary". Finding that NUL would mean inflating the + * whole of every blob the listing names. */ static bool blob_starts_binary(const struct object_id *oid) { diff --git a/tests/t0104-tree.sh b/tests/t0104-tree.sh index d2f5234..5fdc6ac 100755 --- a/tests/t0104-tree.sh +++ b/tests/t0104-tree.sh @@ -318,4 +318,27 @@ test_expect_success 'a listing offers blame only where it works' ' ! grep "href=./bin/blame/big.bin.>blame" tmp ' +# The listing sniffs only the window git judges binary by, while blame and +# the file view look for a NUL anywhere, so a file whose NUL lies past that +# window is offered a blame link that ends on the binary notice. Reading the +# whole of every blob would cost more than that link does. +test_expect_success 'a NUL past the first 8000 bytes still gets a blame link' ' + test_create_repo repos/late && + ( + cd repos/late && + test_seq 1 2000 >late.txt && + printf "\\000end\\n" >>late.txt && + git add late.txt && + git commit -m "late NUL" + ) && + cgitrc_repo laterc late enable-blame=1 && + cgit_ok laterc "url=late/tree/" >tmp && + test_grep "href=./late/blame/late.txt.>blame" tmp && + cgit_ok laterc "url=late/blame/late.txt" >tmp && + test_grep "
Blob is binary
" tmp && + cgit_ok laterc "url=late/tree/late.txt" >tmp && + test_grep "" tmp && + test_grep ! ">blame" tmp +' + test_done -- cgit 2.12.1