• Kirill Smelkov's avatar
    decoder: Fix BININT decoding for negative values · bd5a7fd4
    Kirill Smelkov authored
    Found via fuzzing:
    
    	"I-7\n."
    
    	panic: protocol 1: decode·encode != identity:
    	have: 4294967289
    	want: -7
    
    	goroutine 1 [running]:
    	github.com/kisielk/og-rek.Fuzz(0x7f99bd8b4000, 0x5, 0x200000, 0x3)
    	        /tmp/go-fuzz-build914098789/gopath/src/github.com/kisielk/og-rek/fuzz.go:50 +0x604
    	go-fuzz-dep.Main(0x524df8)
    	        /tmp/go-fuzz-build914098789/goroot/src/go-fuzz-dep/main.go:49 +0xad
    	main.main()
    	        /tmp/go-fuzz-build914098789/gopath/src/github.com/kisielk/og-rek/go.fuzz.main/main.go:10 +0x2d
    	exit status 2
    
    I've checked other handlers, like BININT1 and BININT2, and since there
    everywhere argument is unsigned, there is no similar problem.
    
    We needed previous patch on proper readLine EOF detection, because else
    the testcase for P0("I-7\n.") would be breaking:
    
        --- FAIL: TestDecode/int(-7)/"I-7\n." (0.00s)
            ogorek_test.go:401: no ErrUnexpectedEOF on [:2] truncated stream: v = <nil>  err = &strconv.NumError{Func:"ParseInt", Num:"-", Err:(*errors.errorString)(0xc00000e1b0)}
    bd5a7fd4
ogorek.go 27.1 KB