Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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 } {