fix: Fixes overflow in timer wheel add timer (#780)

This commit is contained in:
Kamron Batman 2021-09-12 14:00:48 -07:00 • committed by GitHub
parent c2d8f7d913
commit 52dacec68f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -136,14 +136,17 @@ namespace Server
private static void AddTimer(Timer timer, long delay) private static void AddTimer(Timer timer, long delay)
{ {
#if DEBUG_TIMERS
var originalDelay = delay
#endif
delay = Math.Max(0, delay); delay = Math.Max(0, delay);
var resolutionPowerOf2 = _tickRatePowerOf2; var resolutionPowerOf2 = _tickRatePowerOf2;
for (var i = 0; i < _ringLayers; i++) for (var i = 0; i < _ringLayers; i++)
{ {
var resolution = 1 << resolutionPowerOf2; var resolution = 1L << resolutionPowerOf2;
var nextResolutionPowerOf2 = resolutionPowerOf2 + _ringSizePowerOf2; var nextResolutionPowerOf2 = resolutionPowerOf2 + _ringSizePowerOf2;
long max = 1 << nextResolutionPowerOf2; var max = 1L << nextResolutionPowerOf2;
if (delay < max) if (delay < max)
{ {
var remaining = delay & (resolution - 1); var remaining = delay & (resolution - 1);
@ -168,13 +171,18 @@ namespace Server
_rings[i][slot] = timer; _rings[i][slot] = timer;
break; return;
} }
// The remaining amount until we turn this ring // The remaining amount until we turn this ring
delay -= resolution * (_ringSize - _ringIndexes[i]); delay -= resolution * (_ringSize - _ringIndexes[i]);
resolutionPowerOf2 = nextResolutionPowerOf2; resolutionPowerOf2 = nextResolutionPowerOf2;
} }
// TODO: Handle timers > 17yrs
#if DEBUG_TIMERS
logger.Error($"Timer is more than max duration. ({originalDelay})");
#endif
} }
public static void DumpInfo(TextWriter tw) public static void DumpInfo(TextWriter tw)