vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Fuzz the parsers that read untrusted input
16bf0ebf8054de5044a52f93d156402542f0f71a · Keenan Nemetz · 10d ago · parent 70ba9a69
Fuzz the parsers that read untrusted input The SSH exec line, the Git HTTP route, and the LFS packet stream are all hand-written parsers on bytes a client controls, and each was covered only by a table of examples someone thought to write. Six targets, each asserting a property rather than waiting for a panic: the command parser cannot invent bytes and its output survives being quoted back, a route re-routes from its own parts and never names more than one path segment, a repository argument is a name and not a path, and the packet reader's lines survive being framed again. The seeds are the shapes the clients actually send, so go test ./... keeps guarding them and a fuzz target costs a push nothing. The route fuzzer found one gap on its first run: /git/.git/info/refs gave back an empty repository name with ok set, and only the store refused it. A route that answers ok now means a name the rest of the path applies to. Closes #96.
server/githttp/transport_test.go +3
| @@ -22,6 +22,9 @@ func TestRoute(t *testing.T) { | |||
| 22 | 22 | }{ | |
| 23 | 23 | {"/git/demo.git/info/refs", "demo", "info/refs", true}, | |
| 24 | 24 | {"/git/demo.git/git-upload-pack", "demo", "git-upload-pack", true}, | |
| 25 | // Found by FuzzRoute: an empty name used to pass, and only the store | ||
| 26 | // refused it. | ||
| 27 | {"/git/.git/info/refs", "", "", false}, | ||
| 25 | 28 | {"/git/demo/info/refs", "", "", false}, | |
| 26 | 29 | {"/other/demo.git/info/refs", "", "", false}, | |
| 27 | 30 | } { | |