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: ...@@ -246,6 +246,10 @@ loop:
if err == errNotImplemented { if err == errNotImplemented {
return nil, OpcodeError{key, insn} 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 return nil, err
} }
} }
...@@ -468,8 +472,8 @@ func (d *Decoder) loadString() error { ...@@ -468,8 +472,8 @@ func (d *Decoder) loadString() error {
return fmt.Errorf("invalid string delimiter: %c", line[0]) return fmt.Errorf("invalid string delimiter: %c", line[0])
} }
if line[len(line)-1] != delim { if len(line) < 2 || line[len(line)-1] != delim {
return fmt.Errorf("insecure string") return io.ErrUnexpectedEOF
} }
d.push(decodeStringEscape(line[1 : len(line)-1])) d.push(decodeStringEscape(line[1 : len(line)-1]))
...@@ -531,10 +535,7 @@ func (d *Decoder) loadUnicode() error { ...@@ -531,10 +535,7 @@ func (d *Decoder) loadUnicode() error {
if err != nil { if err != nil {
return err return err
} }
_, err = buf.WriteRune(r) buf.WriteRune(r)
if err != nil {
return err
}
} }
if len(sline) > 0 { if len(sline) > 0 {
return fmt.Errorf("characters remaining after loadUnicode operation: %s", sline) return fmt.Errorf("characters remaining after loadUnicode operation: %s", sline)
......
...@@ -6,6 +6,8 @@ import ( ...@@ -6,6 +6,8 @@ import (
"io" "io"
"math/big" "math/big"
"reflect" "reflect"
"strconv"
"strings"
"testing" "testing"
) )
...@@ -81,6 +83,23 @@ func TestDecode(t *testing.T) { ...@@ -81,6 +83,23 @@ func TestDecode(t *testing.T) {
if !(v == nil && err == io.EOF) { if !(v == nil && err == io.EOF) {
t.Errorf("decode: no EOF at end: v = %#v err = %#v", v, err) 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) { ...@@ -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) { func TestZeroLengthData(t *testing.T) {
data := "" data := ""
output, err := decodeLong(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