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).