From 993fc855757f57ad4d94cf70dce95165b63119a0 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez <98576999+nicolassanchez02@users.noreply.github.com> Date: Fri, 29 May 2026 20:23:40 -0500 Subject: [PATCH] Avoid shared mutable default for race qualTimes DistributedRaceAI.__init__ defaulted qualTimes=[] and then did self.qualTimes.append(...), mutating the single list object that the default binds once at definition time. Every race created without an explicit qualTimes (e.g. from a race pad, where RaceManagerAI.createRace also defaulted qualTimes=[]) shared and grew that same list, leaking qualifying times across unrelated races for the life of the AI process. Switched both defaults to None and build a fresh list in DistributedRaceAI when none is passed. --- toontown/racing/DistributedRaceAI.py | 4 ++-- toontown/racing/RaceManagerAI.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/toontown/racing/DistributedRaceAI.py b/toontown/racing/DistributedRaceAI.py index 25312f8..5a2bb4e 100644 --- a/toontown/racing/DistributedRaceAI.py +++ b/toontown/racing/DistributedRaceAI.py @@ -11,7 +11,7 @@ from direct.distributed.ClockDelta import * class DistributedRaceAI(DistributedObjectAI.DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedRaceAI') - def __init__(self, air, trackId, zoneId, avIds, laps, raceType, racerFinishedFunc, raceDoneFunc, circuitLoop, circuitPoints, circuitTimes, qualTimes=[], circuitTimeList={}, circuitTotalBonusTickets={}): + def __init__(self, air, trackId, zoneId, avIds, laps, raceType, racerFinishedFunc, raceDoneFunc, circuitLoop, circuitPoints, circuitTimes, qualTimes=None, circuitTimeList={}, circuitTotalBonusTickets={}): DistributedObjectAI.DistributedObjectAI.__init__(self, air) self.trackId = trackId self.direction = self.trackId % 2 @@ -44,7 +44,7 @@ class DistributedRaceAI(DistributedObjectAI.DistributedObjectAI): self.gagList = [ 0] * len(RaceGlobals.TrackDict[trackId][4]) self.circuitLoop = circuitLoop - self.qualTimes = qualTimes + self.qualTimes = qualTimes if qualTimes is not None else [] self.circuitTimeList = circuitTimeList self.qualTimes.append(RaceGlobals.TrackDict[trackId][1]) self.circuitTotalBonusTickets = circuitTotalBonusTickets diff --git a/toontown/racing/RaceManagerAI.py b/toontown/racing/RaceManagerAI.py index b19e54f..3745c92 100644 --- a/toontown/racing/RaceManagerAI.py +++ b/toontown/racing/RaceManagerAI.py @@ -21,7 +21,7 @@ class RaceManagerAI(DirectObject.DirectObject): def getDoId(self): return 0 - def createRace(self, trackId, raceType, laps, players, circuitLoop, circuitPoints, circuitTimes, qualTimes=[], circuitTimeList={}, circuitTotalBonusTickets={}): + def createRace(self, trackId, raceType, laps, players, circuitLoop, circuitPoints, circuitTimes, qualTimes=None, circuitTimeList={}, circuitTotalBonusTickets={}): raceZone = self.air.allocateZone() race = DistributedRaceAI.DistributedRaceAI(self.air, trackId, raceZone, players, laps, raceType, self.exitedRace, self.raceOver, circuitLoop, circuitPoints, circuitTimes, qualTimes, circuitTimeList, circuitTotalBonusTickets) race.generateWithRequired(raceZone)