@@ -33,17 +33,18 @@ type ValueReader interface {
33
33
}
34
34
35
35
type noBufValueReader struct {
36
- reader io.Reader
37
- eof bool
38
- readCount int
39
- header [1 ]byte
36
+ reader io.Reader
37
+ eof bool
38
+ readCount int
39
+ header [1 ]byte
40
+ readerSize int
40
41
}
41
42
42
43
func EndOfFile (err error ) bool {
43
44
return err == io .EOF || err == io .ErrUnexpectedEOF
44
45
}
45
46
46
- func (r * noBufValueReader ) filerErr (err error ) error {
47
+ func (r * noBufValueReader ) filterErr (err error ) error {
47
48
if EndOfFile (err ) {
48
49
r .eof = true
49
50
return io .EOF
@@ -62,13 +63,17 @@ func (r *noBufValueReader) HasMore() bool {
62
63
return true
63
64
}
64
65
66
+ func (r * noBufValueReader ) left () int {
67
+ return r .readerSize - r .readCount
68
+ }
69
+
65
70
func (r * noBufValueReader ) ReadHeader () (TypeHeader , uint32 , error ) {
66
71
if ! r .HasMore () {
67
72
return 0 , 0 , io .EOF
68
73
}
69
74
b , err := r .ReadByte ()
70
75
if err != nil {
71
- return 0 , 0 , r .filerErr (err )
76
+ return 0 , 0 , r .filterErr (err )
72
77
}
73
78
return ParseRTLHeader (b )
74
79
}
@@ -80,7 +85,7 @@ func (r *noBufValueReader) ReadByte() (byte, error) {
80
85
n , err := io .ReadFull (r .reader , r .header [:])
81
86
r .readCount += n
82
87
if err != nil {
83
- return 0 , r .filerErr (err )
88
+ return 0 , r .filterErr (err )
84
89
}
85
90
if n <= 0 {
86
91
r .eof = true
@@ -96,29 +101,38 @@ func (r *noBufValueReader) Read(p []byte) (int, error) {
96
101
97
102
n , err := io .ReadFull (r .reader , p )
98
103
r .readCount += n
99
- return n , r .filerErr (err )
104
+ return n , r .filterErr (err )
100
105
}
101
106
102
107
func (r * noBufValueReader ) ReadBytes (length int , bytes []byte ) ([]byte , error ) {
103
108
return ReadBytesFromReader (r , length , bytes )
104
109
}
105
110
106
111
func (r * noBufValueReader ) ReadMultiLength (length int ) (uint64 , error ) {
107
- return ReadMultiLengthFromReader (r , length )
112
+ ret , err := ReadMultiLengthFromReader (r , length )
113
+ if err != nil {
114
+ return 0 , err
115
+ }
116
+ left := r .left ()
117
+ if left <= 0 || ret > uint64 (left ) {
118
+ return 0 , fmt .Errorf ("%d bytes multi-length(%d) is larger than left(%d)" , length , ret , left )
119
+ }
120
+ return ret , nil
108
121
}
109
122
110
123
func (r * noBufValueReader ) ReadMultiLengthBytes (length int , bytes []byte ) ([]byte , error ) {
111
124
return ReadMultiLengthBytesFromReader (r , length , bytes )
112
125
}
113
126
114
127
type bufValueReader struct {
115
- reader io.Reader // basic reader
116
- eof bool // if the reader EOF
117
- lastError error // error of last reading(if exist, except io.EOF)
118
- buffer []byte // buffered bytes
119
- available uint32 // length of available bytes in buffer
120
- offset uint32 // offset for buffer of reading
121
- readCount int // counting the read bytes
128
+ reader io.Reader // basic reader
129
+ eof bool // if the reader EOF
130
+ lastError error // error of last reading(if exist, except io.EOF)
131
+ buffer []byte // buffered bytes
132
+ available uint32 // length of available bytes in buffer
133
+ offset uint32 // offset for buffer of reading
134
+ readCount int // counting the read bytes
135
+ readerSize int // summary size of the reader, if it's a stream, set to MaxSliceSize
122
136
}
123
137
124
138
func (r * bufValueReader ) ResetCount () {
@@ -136,6 +150,10 @@ func (r *bufValueReader) HasMore() bool {
136
150
return r .next ()
137
151
}
138
152
153
+ func (r * bufValueReader ) left () int {
154
+ return r .readerSize - r .readCount
155
+ }
156
+
139
157
// next read more bytes to buffer when buffer is empty,
140
158
// and return whether has more bytes in buffer
141
159
func (r * bufValueReader ) next () bool {
@@ -258,7 +276,15 @@ func (r *bufValueReader) ReadBytes(length int, bytes []byte) ([]byte, error) {
258
276
259
277
// ReadMultiLength read length of multi bytes header value's length
260
278
func (r * bufValueReader ) ReadMultiLength (length int ) (uint64 , error ) {
261
- return ReadMultiLengthFromReader (r , length )
279
+ ret , err := ReadMultiLengthFromReader (r , length )
280
+ if err != nil {
281
+ return 0 , err
282
+ }
283
+ left := r .left ()
284
+ if left <= 0 || ret > uint64 (left ) {
285
+ return 0 , fmt .Errorf ("%d bytes multi-length(%d) is larger than left(%d)" , length , ret , left )
286
+ }
287
+ return ret , nil
262
288
}
263
289
264
290
func (r * bufValueReader ) ReadMultiLengthBytes (length int , bytes []byte ) ([]byte , error ) {
@@ -335,15 +361,26 @@ func ReadMultiLengthBytesFromReader(vr ValueReader, length int, bytes []byte) ([
335
361
}
336
362
337
363
func NewValueReader (r io.Reader , bufferSize int ) ValueReader {
364
+ len := int (MaxSliceSize )
365
+ lenner , ok := r .(Lenner )
366
+ if ok {
367
+ len = lenner .Len ()
368
+ }
338
369
if bufferSize > 0 {
339
370
return & bufValueReader {
340
- reader : r ,
341
- eof : false ,
342
- buffer : make ([]byte , bufferSize ),
343
- available : 0 ,
344
- offset : 0 ,
371
+ reader : r ,
372
+ eof : false ,
373
+ buffer : make ([]byte , bufferSize ),
374
+ available : 0 ,
375
+ offset : 0 ,
376
+ readerSize : len ,
345
377
}
346
378
} else {
347
- return & noBufValueReader {reader : r , eof : false , readCount : 0 }
379
+ return & noBufValueReader {
380
+ reader : r ,
381
+ eof : false ,
382
+ readCount : 0 ,
383
+ readerSize : len ,
384
+ }
348
385
}
349
386
}
0 commit comments