Commit 60b23d0a authored by Kamil Kisiel's avatar Kamil Kisiel Committed by GitHub

Merge pull request #27 from navytux/fix1

encoder: More unexpected EOF handling
parents c7dbf2e4 a5094338
......@@ -246,6 +246,10 @@ loop:
if err == errNotImplemented {
return nil, OpcodeError{key, insn}
}
// EOF from individual opcode decoder is unexpected end of stream
if err == io.EOF {
err = io.ErrUnexpectedEOF
}
return nil, err
}
}
......@@ -468,8 +472,8 @@ func (d *Decoder) loadString() error {
return fmt.Errorf("invalid string delimiter: %c", line[0])
}
if line[len(line)-1] != delim {
return fmt.Errorf("insecure string")
if len(line) < 2 || line[len(line)-1] != delim {
return io.ErrUnexpectedEOF
}
d.push(decodeStringEscape(line[1 : len(line)-1]))
......@@ -531,10 +535,7 @@ func (d *Decoder) loadUnicode() error {
if err != nil {
return err
}
_, err = buf.WriteRune(r)
if err != nil {
return err
}
buf.WriteRune(r)
}
if len(sline) > 0 {
return fmt.Errorf("characters remaining after loadUnicode operation: %s", sline)
......
......@@ -6,6 +6,8 @@ import (
"io"
"math/big"
"reflect"
"strconv"
"strings"
"testing"
)
......@@ -81,6 +83,23 @@ func TestDecode(t *testing.T) {
if !(v == nil && err == io.EOF) {
t.Errorf("decode: no EOF at end: v = %#v err = %#v", v, err)
}
// for truncated input io.ErrUnexpectedEOF must be returned
for l := len(test.input) - 1; l > 0; l-- {
buf := bytes.NewBufferString(test.input[:l])
dec := NewDecoder(buf)
//println(test.name, l)
v, err := dec.Decode()
// strconv.UnquoteChar used in loadUnicode always returns
// SyntaxError, at least unless the following CL is accepted:
// https://go-review.googlesource.com/37052
if err == strconv.ErrSyntax && strings.HasPrefix(test.name, "unicode") {
err = io.ErrUnexpectedEOF
}
if !(v == nil && err == io.ErrUnexpectedEOF) {
t.Errorf("%s: no ErrUnexpectedEOF on [:%d] truncated stream: v = %#v err = %#v", test.name, l, v, err)
}
}
}
}
......@@ -110,17 +129,6 @@ func TestDecodeMultiple(t *testing.T) {
}
}
func TestDecodeUnexpectedEOF(t *testing.T) {
input := "I5\n"
buf := bytes.NewBufferString(input)
dec := NewDecoder(buf)
obj, err := dec.Decode()
if !(obj == nil && err == io.ErrUnexpectedEOF) {
t.Errorf("decode: no ErrUnexpectedEOF on truncated stream: obj = %#v err = %#v", obj, err)
}
}
func TestZeroLengthData(t *testing.T) {
data := ""
output, err := decodeLong(data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment