• Kirill Smelkov's avatar
    decoder: Return EOF, not panic on a proper end of stream · 995fce81
    Kirill Smelkov authored
    io.EOF handling was already there in instructions decoding loop, but it
    was simply breaking out of the loop and in the end decode
    unconditionally was trying to pop top element from stack, and since
    stack is empty panicked. E.g. for "" input this way:
    
    --- FAIL: TestDecode (0.00s)
    panic: runtime error: index out of range [recovered]
            panic: runtime error: index out of range
    
    goroutine 20 [running]:
    testing.tRunner.func1(0xc4200765b0)
            /home/kirr/src/tools/go/go/src/testing/testing.go:624 +0x267
    panic(0x5368c0, 0x603010)
            /home/kirr/src/tools/go/go/src/runtime/panic.go:489 +0x26e
    github.com/kisielk/og-rek.Decoder.Decode(0xc4200ea5a0, 0x624908, 0x0, 0x0, 0xc4200e6b10, 0x52a180, 0xc4200ee308, 0x0, 0x0)
            /home/kirr/src/wendelin/neo/g.neo/src/github.com/kisielk/og-rek/ogorek.go:250 +0x4bb
    github.com/kisielk/og-rek.TestDecode(0xc4200765b0)
            /home/kirr/src/wendelin/neo/g.neo/src/github.com/kisielk/og-rek/ogorek_test.go:80 +0x232f
    testing.tRunner(0xc4200765b0, 0x567648)
            /home/kirr/src/tools/go/go/src/testing/testing.go:659 +0x98
    created by testing.(*T).Run
            /home/kirr/src/tools/go/go/src/testing/testing.go:701 +0x2df
    exit status 2
    
    Fix it via reworking EOF handling:
    
    - if we see EOF and no instructions was decoded so far - just return it
      to the caller
    
    - if we see EOF in the middle of the stream - as valid pickle streams
      end with Stop opcode - it is unexpected EOF - return it as such.
    
    A couple of tests had to be adjusted in TestDecode - as input there was
    not a valid pickle - not ending with "." (which python pickle decoder
    also does not decode at all).
    995fce81
ogorek.go 18.5 KB