@@ -200,6 +200,14 @@ func (c *statSegment) copyEntryData(dirEntry *statSegDirectoryEntry) adapter.Sta
200
200
return adapter .ScalarStat (dirEntry .unionData )
201
201
202
202
case statDirErrorIndex :
203
+ if dirEntry .unionData == 0 {
204
+ debugf ("offset invalid for %s" , dirEntry .name )
205
+ break
206
+ } else if dirEntry .unionData >= uint64 (len (c .sharedHeader )) {
207
+ debugf ("offset out of range for %s" , dirEntry .name )
208
+ break
209
+ }
210
+
203
211
_ , errOffset , _ := c .getOffsets ()
204
212
offsetVector := unsafe .Pointer (& c .sharedHeader [errOffset ])
205
213
@@ -324,6 +332,14 @@ func (c *statSegment) updateEntryData(dirEntry *statSegDirectoryEntry, stat *ada
324
332
* stat = adapter .ScalarStat (dirEntry .unionData )
325
333
326
334
case adapter.ErrorStat :
335
+ if dirEntry .unionData == 0 {
336
+ debugf ("offset invalid for %s" , dirEntry .name )
337
+ break
338
+ } else if dirEntry .unionData >= uint64 (len (c .sharedHeader )) {
339
+ debugf ("offset out of range for %s" , dirEntry .name )
340
+ break
341
+ }
342
+
327
343
_ , errOffset , _ := c .getOffsets ()
328
344
offsetVector := unsafe .Pointer (& c .sharedHeader [errOffset ])
329
345
@@ -334,8 +350,9 @@ func (c *statSegment) updateEntryData(dirEntry *statSegDirectoryEntry, stat *ada
334
350
val := * (* adapter .Counter )(statSegPointer (offsetVector , offset ))
335
351
errData = val
336
352
} else {
337
- vecLen := vectorLen (offsetVector )
338
- for i := uint64 (0 ); i < vecLen ; i ++ {
353
+ vecLen := uint32 (vectorLen (unsafe .Pointer (& c .sharedHeader [errOffset ])))
354
+
355
+ for i := uint32 (0 ); i < vecLen ; i ++ {
339
356
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
340
357
offset := uintptr (cb ) + uintptr (dirEntry .unionData )* unsafe .Sizeof (adapter .Counter (0 ))
341
358
val := * (* adapter .Counter )(statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), offset ))
@@ -353,22 +370,22 @@ func (c *statSegment) updateEntryData(dirEntry *statSegDirectoryEntry, stat *ada
353
370
break
354
371
}
355
372
356
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
373
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
357
374
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
358
375
359
376
data := (* stat ).(adapter.SimpleCounterStat )
360
- if uint64 (len (data )) != vecLen {
377
+ if uint32 (len (data )) != vecLen {
361
378
return ErrStatDataLenIncorrect
362
379
}
363
- for i := uint64 (0 ); i < vecLen ; i ++ {
380
+ for i := uint32 (0 ); i < vecLen ; i ++ {
364
381
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
365
382
counterVec := unsafe .Pointer (& c .sharedHeader [uintptr (cb )])
366
- vecLen2 := vectorLen (counterVec )
383
+ vecLen2 := uint32 ( vectorLen (counterVec ) )
367
384
simpData := data [i ]
368
- if uint64 (len (simpData )) != vecLen2 {
385
+ if uint32 (len (simpData )) != vecLen2 {
369
386
return ErrStatDataLenIncorrect
370
387
}
371
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
388
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
372
389
offset := uintptr (j ) * unsafe .Sizeof (adapter .Counter (0 ))
373
390
val := * (* adapter .Counter )(statSegPointer (counterVec , offset ))
374
391
simpData [j ] = val
@@ -384,22 +401,22 @@ func (c *statSegment) updateEntryData(dirEntry *statSegDirectoryEntry, stat *ada
384
401
break
385
402
}
386
403
387
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
404
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
388
405
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
389
406
390
407
data := (* stat ).(adapter.CombinedCounterStat )
391
- if uint64 (len (data )) != vecLen {
408
+ if uint32 (len (data )) != vecLen {
392
409
return ErrStatDataLenIncorrect
393
410
}
394
- for i := uint64 (0 ); i < vecLen ; i ++ {
411
+ for i := uint32 (0 ); i < vecLen ; i ++ {
395
412
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
396
413
counterVec := unsafe .Pointer (& c .sharedHeader [uintptr (cb )])
397
- vecLen2 := vectorLen (counterVec )
414
+ vecLen2 := uint32 ( vectorLen (counterVec ) )
398
415
combData := data [i ]
399
- if uint64 (len (combData )) != vecLen2 {
416
+ if uint32 (len (combData )) != vecLen2 {
400
417
return ErrStatDataLenIncorrect
401
418
}
402
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
419
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
403
420
offset := uintptr (j ) * unsafe .Sizeof (adapter.CombinedCounter {})
404
421
val := * (* adapter .CombinedCounter )(statSegPointer (counterVec , offset ))
405
422
combData [j ] = val
@@ -415,26 +432,26 @@ func (c *statSegment) updateEntryData(dirEntry *statSegDirectoryEntry, stat *ada
415
432
break
416
433
}
417
434
418
- vecLen := vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]))
435
+ vecLen := uint32 ( vectorLen (unsafe .Pointer (& c .sharedHeader [dirEntry .unionData ]) ))
419
436
offsetVector := statSegPointer (unsafe .Pointer (& c .sharedHeader [0 ]), uintptr (dirEntry .offsetVector ))
420
437
421
438
data := (* stat ).(adapter.NameStat )
422
- if uint64 (len (data )) != vecLen {
439
+ if uint32 (len (data )) != vecLen {
423
440
return ErrStatDataLenIncorrect
424
441
}
425
- for i := uint64 (0 ); i < vecLen ; i ++ {
442
+ for i := uint32 (0 ); i < vecLen ; i ++ {
426
443
cb := * (* uint64 )(statSegPointer (offsetVector , uintptr (i )* unsafe .Sizeof (uint64 (0 ))))
427
444
if cb == 0 {
428
445
continue
429
446
}
430
447
nameVec := unsafe .Pointer (& c .sharedHeader [cb ])
431
- vecLen2 := vectorLen (nameVec )
448
+ vecLen2 := uint32 ( vectorLen (nameVec ) )
432
449
433
450
nameData := data [i ]
434
- if uint64 (len (nameData ))+ 1 != vecLen2 {
451
+ if uint32 (len (nameData ))+ 1 != vecLen2 {
435
452
return ErrStatDataLenIncorrect
436
453
}
437
- for j := uint64 (0 ); j < vecLen2 ; j ++ {
454
+ for j := uint32 (0 ); j < vecLen2 ; j ++ {
438
455
offset := uintptr (j ) * unsafe .Sizeof (byte (0 ))
439
456
val := * (* byte )(statSegPointer (nameVec , offset ))
440
457
if val == 0 {
0 commit comments