From 2f1a2ff39da53340d6e828e58f2c493ef02309e1 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Thu, 28 Dec 2023 01:16:59 +0530 Subject: [PATCH] Protect against stats getting reset. (#2351) A reset would make `after` look like it is `before` and the diff will be large unsigned numbers. --- pkg/rtc/types/trafficstats.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/rtc/types/trafficstats.go b/pkg/rtc/types/trafficstats.go index 06e43786a..f5c0b386d 100644 --- a/pkg/rtc/types/trafficstats.go +++ b/pkg/rtc/types/trafficstats.go @@ -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