Protect against stats getting reset. (#2351)

A reset would make `after` look like it is `before` and the diff will be
large unsigned numbers.
This commit is contained in:
Raja Subramanian
2023-12-28 01:16:59 +05:30
committed by GitHub
parent 5eea679589
commit 2f1a2ff39d
+14 -1
View File
@@ -50,7 +50,7 @@ func RTPStatsDiffToTrafficStats(before, after *livekit.RTPStats) *TrafficStats {
startTime = before.EndTime
}
if before == nil {
getAfter := func() *TrafficStats {
return &TrafficStats{
StartTime: startTime.AsTime(),
EndTime: after.EndTime.AsTime(),
@@ -62,6 +62,19 @@ func RTPStatsDiffToTrafficStats(before, after *livekit.RTPStats) *TrafficStats {
}
}
if before == nil {
return getAfter()
}
if (after.Packets - before.Packets) > (1 << 31) {
// after packets < before packets, probably got reset, just return after
return getAfter()
}
if ((after.Bytes + after.BytesDuplicate + after.BytesPadding) - (before.Bytes + before.BytesDuplicate + before.BytesPadding)) > (1 << 63) {
// after bytes < before bytes, probably got reset, just return after
return getAfter()
}
packetsLost := uint32(0)
if after.PacketsLost >= before.PacketsLost {
packetsLost = after.PacketsLost - before.PacketsLost