@@ -156,39 +156,66 @@ func (d *DataDecoder) decodeFromTypeToDeserializer(
156
156
return newOffset , err
157
157
case _Slice :
158
158
return d .decodeSliceToDeserializer (size , offset , dser , depth )
159
- }
160
-
161
- // For the remaining types, size is the byte size
162
- if offset + size > uint (len (d .buffer )) {
163
- return 0 , mmdberrors .NewOffsetError ()
164
- }
165
- switch dtype {
166
159
case _Bytes :
167
- v , offset := d .decodeBytes (size , offset )
160
+ v , offset , err := d .decodeBytes (size , offset )
161
+ if err != nil {
162
+ return 0 , err
163
+ }
168
164
return offset , dser .Bytes (v )
169
165
case _Float32 :
170
- v , offset := d .decodeFloat32 (size , offset )
166
+ v , offset , err := d .decodeFloat32 (size , offset )
167
+ if err != nil {
168
+ return 0 , err
169
+ }
171
170
return offset , dser .Float32 (v )
172
171
case _Float64 :
173
- v , offset := d .decodeFloat64 (size , offset )
172
+ v , offset , err := d .decodeFloat64 (size , offset )
173
+ if err != nil {
174
+ return 0 , err
175
+ }
176
+
174
177
return offset , dser .Float64 (v )
175
178
case _Int32 :
176
- v , offset := d .decodeInt (size , offset )
179
+ v , offset , err := d .decodeInt (size , offset )
180
+ if err != nil {
181
+ return 0 , err
182
+ }
183
+
177
184
return offset , dser .Int32 (int32 (v ))
178
185
case _String :
179
- v , offset := d .decodeString (size , offset )
186
+ v , offset , err := d .decodeString (size , offset )
187
+ if err != nil {
188
+ return 0 , err
189
+ }
190
+
180
191
return offset , dser .String (v )
181
192
case _Uint16 :
182
- v , offset := d .decodeUint (size , offset )
193
+ v , offset , err := d .decodeUint (size , offset )
194
+ if err != nil {
195
+ return 0 , err
196
+ }
197
+
183
198
return offset , dser .Uint16 (uint16 (v ))
184
199
case _Uint32 :
185
- v , offset := d .decodeUint (size , offset )
200
+ v , offset , err := d .decodeUint (size , offset )
201
+ if err != nil {
202
+ return 0 , err
203
+ }
204
+
186
205
return offset , dser .Uint32 (uint32 (v ))
187
206
case _Uint64 :
188
- v , offset := d .decodeUint (size , offset )
207
+ v , offset , err := d .decodeUint (size , offset )
208
+ if err != nil {
209
+ return 0 , err
210
+ }
211
+
189
212
return offset , dser .Uint64 (v )
190
213
case _Uint128 :
191
- v , offset := d .decodeUint128 (size , offset )
214
+ v , offset , err := d .decodeUint128 (size , offset )
215
+ if err != nil {
216
+ return 0 , err
217
+ }
218
+
192
219
return offset , dser .Uint128 (v )
193
220
default :
194
221
return 0 , mmdberrors .NewInvalidDatabaseError ("unknown type: %d" , dtype )
@@ -199,32 +226,48 @@ func decodeBool(size, offset uint) (bool, uint) {
199
226
return size != 0 , offset
200
227
}
201
228
202
- func (d * DataDecoder ) decodeBytes (size , offset uint ) ([]byte , uint ) {
229
+ func (d * DataDecoder ) decodeBytes (size , offset uint ) ([]byte , uint , error ) {
230
+ if offset + size > uint (len (d .buffer )) {
231
+ return nil , 0 , mmdberrors .NewOffsetError ()
232
+ }
233
+
203
234
newOffset := offset + size
204
235
bytes := make ([]byte , size )
205
236
copy (bytes , d .buffer [offset :newOffset ])
206
- return bytes , newOffset
237
+ return bytes , newOffset , nil
207
238
}
208
239
209
- func (d * DataDecoder ) decodeFloat64 (size , offset uint ) (float64 , uint ) {
240
+ func (d * DataDecoder ) decodeFloat64 (size , offset uint ) (float64 , uint , error ) {
241
+ if offset + size > uint (len (d .buffer )) {
242
+ return 0 , 0 , mmdberrors .NewOffsetError ()
243
+ }
244
+
210
245
newOffset := offset + size
211
246
bits := binary .BigEndian .Uint64 (d .buffer [offset :newOffset ])
212
- return math .Float64frombits (bits ), newOffset
247
+ return math .Float64frombits (bits ), newOffset , nil
213
248
}
214
249
215
- func (d * DataDecoder ) decodeFloat32 (size , offset uint ) (float32 , uint ) {
250
+ func (d * DataDecoder ) decodeFloat32 (size , offset uint ) (float32 , uint , error ) {
251
+ if offset + size > uint (len (d .buffer )) {
252
+ return 0 , 0 , mmdberrors .NewOffsetError ()
253
+ }
254
+
216
255
newOffset := offset + size
217
256
bits := binary .BigEndian .Uint32 (d .buffer [offset :newOffset ])
218
- return math .Float32frombits (bits ), newOffset
257
+ return math .Float32frombits (bits ), newOffset , nil
219
258
}
220
259
221
- func (d * DataDecoder ) decodeInt (size , offset uint ) (int , uint ) {
260
+ func (d * DataDecoder ) decodeInt (size , offset uint ) (int , uint , error ) {
261
+ if offset + size > uint (len (d .buffer )) {
262
+ return 0 , 0 , mmdberrors .NewOffsetError ()
263
+ }
264
+
222
265
newOffset := offset + size
223
266
var val int32
224
267
for _ , b := range d .buffer [offset :newOffset ] {
225
268
val = (val << 8 ) | int32 (b )
226
269
}
227
- return int (val ), newOffset
270
+ return int (val ), newOffset , nil
228
271
}
229
272
230
273
func (d * DataDecoder ) decodeMapToDeserializer (
@@ -314,28 +357,40 @@ func (d *DataDecoder) decodeSliceToDeserializer(
314
357
return offset , nil
315
358
}
316
359
317
- func (d * DataDecoder ) decodeString (size , offset uint ) (string , uint ) {
360
+ func (d * DataDecoder ) decodeString (size , offset uint ) (string , uint , error ) {
361
+ if offset + size > uint (len (d .buffer )) {
362
+ return "" , 0 , mmdberrors .NewOffsetError ()
363
+ }
364
+
318
365
newOffset := offset + size
319
- return string (d .buffer [offset :newOffset ]), newOffset
366
+ return string (d .buffer [offset :newOffset ]), newOffset , nil
320
367
}
321
368
322
- func (d * DataDecoder ) decodeUint (size , offset uint ) (uint64 , uint ) {
369
+ func (d * DataDecoder ) decodeUint (size , offset uint ) (uint64 , uint , error ) {
370
+ if offset + size > uint (len (d .buffer )) {
371
+ return 0 , 0 , mmdberrors .NewOffsetError ()
372
+ }
373
+
323
374
newOffset := offset + size
324
375
bytes := d .buffer [offset :newOffset ]
325
376
326
377
var val uint64
327
378
for _ , b := range bytes {
328
379
val = (val << 8 ) | uint64 (b )
329
380
}
330
- return val , newOffset
381
+ return val , newOffset , nil
331
382
}
332
383
333
- func (d * DataDecoder ) decodeUint128 (size , offset uint ) (* big.Int , uint ) {
384
+ func (d * DataDecoder ) decodeUint128 (size , offset uint ) (* big.Int , uint , error ) {
385
+ if offset + size > uint (len (d .buffer )) {
386
+ return nil , 0 , mmdberrors .NewOffsetError ()
387
+ }
388
+
334
389
newOffset := offset + size
335
390
val := new (big.Int )
336
391
val .SetBytes (d .buffer [offset :newOffset ])
337
392
338
- return val , newOffset
393
+ return val , newOffset , nil
339
394
}
340
395
341
396
func uintFromBytes (prefix uint , uintBytes []byte ) uint {
0 commit comments