瀏覽代碼

wal: change io.EOF returned by readFull to io.ErrUnexpectedEOF

Decoder should return error for any broken block including the
one that only contains the length field. We should change io.EOF
to io.ErrUnexpectedEOF before return the error.
Xiang Li 11 年之前
父節點
當前提交
d1d7feacc9
共有 2 個文件被更改,包括 6 次插入 和 0 次删除
  1. 5 0
      wal/decoder.go
  2. 1 0
      wal/record_test.go

+ 5 - 0
wal/decoder.go

@@ -54,6 +54,11 @@ func (d *decoder) decode(rec *walpb.Record) error {
 	}
 	}
 	data := make([]byte, l)
 	data := make([]byte, l)
 	if _, err = io.ReadFull(d.br, data); err != nil {
 	if _, err = io.ReadFull(d.br, data); err != nil {
+		// ReadFull returns io.EOF only if no bytes were read
+		// the decoder should treat this as an ErrUnexpectedEOF instead.
+		if err == io.EOF {
+			err = io.ErrUnexpectedEOF
+		}
 		return err
 		return err
 	}
 	}
 	if err := rec.Unmarshal(data); err != nil {
 	if err := rec.Unmarshal(data); err != nil {

+ 1 - 0
wal/record_test.go

@@ -42,6 +42,7 @@ func TestReadRecord(t *testing.T) {
 	}{
 	}{
 		{infoRecord, &walpb.Record{Type: 1, Crc: crc32.Checksum(infoData, crcTable), Data: infoData}, nil},
 		{infoRecord, &walpb.Record{Type: 1, Crc: crc32.Checksum(infoData, crcTable), Data: infoData}, nil},
 		{[]byte(""), &walpb.Record{}, io.EOF},
 		{[]byte(""), &walpb.Record{}, io.EOF},
+		{infoRecord[:8], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-len(infoData)-8], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-len(infoData)-8], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-len(infoData)], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-len(infoData)], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-8], &walpb.Record{}, io.ErrUnexpectedEOF},
 		{infoRecord[:len(infoRecord)-8], &walpb.Record{}, io.ErrUnexpectedEOF},