dog/git/CFG.c (gitconfig-family ragel), dog/git/SUBS.c (.gitmodules) and
dog/git/IGNO.c (.gitignore chain) all parse files that arrive verbatim from a
cloned, untrusted repository, yet dog/fuzz/ has no target for any of them —
they only get happy-path unit tests (test/CFG.c, test/IGNO.c). DOG-015
(IGNOGlob ReDoS) is exactly the class a fuzzer would have caught. Method: Issues.
.git/config-family via CFGu8sFeed/CFGu8sDrain,
.gitmodules via SUBSu8sParse/SUBSu8sFind, .gitignore via
IGNOLoad/IGNOMatch/IGNOFree — every clone/status walks these.dog/fuzz/PACKRESOLVE.c is the house pattern: bounded input, BASS carves
in a per-probe call() frame, errors expected, only faults surface.dog/fuzz/: CFGfuzz, SUBSfuzz, IGNOfuzz, wired into
dog/fuzz/CMakeLists.txt, built with WITH_FUZZ + ASan.CFGu8sFeed terminates and consumes monotonically; SUBS cb gets $ok
path/url slices; IGNOMatch returns within a step budget (libFuzzer
-timeout as the hang oracle until DOG-015 lands the budget).test/data + real-world config/gitmodules/gitignore samples.CFGfuzz: drive CFGstate feed/drain to exhaustion, slice bounds checks.SUBSfuzz: parse + SUBSu8sFind a fuzzed name; cb slice invariants.IGNOfuzz: split input into chain files + a path; Load/Match/Free cycle.~/src/DOG-018 (fuzz/CFG.c,
fuzz/SUBS.c, fuzz/IGNO.c, CMake wiring, seeded corpora), UNLANDED.
Orchestrator-verified: only fuzz/CMakeLists.txt modified among tracked
files; CFGfuzz/SUBSfuzz re-run clean (7.9M/3.0M execs per 60 s).IGNOFree (git/IGNO.c:297) frees a FILEMapRO
mapping with u8bUnMap (munmap only) instead of FILEUnMap (unmap +
close of the booked fd) — one fd leaked per mapped .gitignore;
verified at source + empirically (run dies "No file descriptors
available"). Candidate ticket, NOT fixed here (harness-only rule).