0
0
Fork 1
mirror of https://mau.dev/maunium/synapse.git synced 2024-06-25 22:18:18 +02:00

Have MockClock detect attempts to cancel expired timers, to prevent a repeat of SYN-230

This commit is contained in:
Paul "LeoNerd" Evans 2015-01-13 16:57:55 +00:00
parent c2e7c84e58
commit cf7e723808

View file

@ -138,7 +138,8 @@ class MockClock(object):
now = 1000 now = 1000
def __init__(self): def __init__(self):
# list of tuples of (absolute_time, callback) in no particular order # list of lists of [absolute_time, callback, expired] in no particular
# order
self.timers = [] self.timers = []
def time(self): def time(self):
@ -154,11 +155,16 @@ class MockClock(object):
LoggingContext.thread_local.current_context = current_context LoggingContext.thread_local.current_context = current_context
callback() callback()
t = (self.now + delay, wrapped_callback) t = [self.now + delay, wrapped_callback, False]
self.timers.append(t) self.timers.append(t)
return t return t
def cancel_call_later(self, timer): def cancel_call_later(self, timer):
if timer[2]:
raise Exception("Cannot cancel an expired timer")
timer[2] = True
self.timers = [t for t in self.timers if t != timer] self.timers = [t for t in self.timers if t != timer]
# For unit testing # For unit testing
@ -168,11 +174,17 @@ class MockClock(object):
timers = self.timers timers = self.timers
self.timers = [] self.timers = []
for time, callback in timers: for t in timers:
time, callback, expired = t
if expired:
raise Exception("Timer already expired")
if self.now >= time: if self.now >= time:
t[2] = True
callback() callback()
else: else:
self.timers.append((time, callback)) self.timers.append(t)
class SQLiteMemoryDbPool(ConnectionPool, object): class SQLiteMemoryDbPool(ConnectionPool, object):