From 82fe1ff66f7e23d7eb8b28e37a8f84b5eeb73390 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <slouken@libsdl.org>
Date: Tue, 4 Jan 2005 19:05:32 +0000
Subject: [PATCH] Fix potential use of freed memory in the threaded timer
 system

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401024
---
 src/timer/SDL_timer.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/timer/SDL_timer.c b/src/timer/SDL_timer.c
index 10748e2e..0706042d 100644
--- a/src/timer/SDL_timer.c
+++ b/src/timer/SDL_timer.c
@@ -45,7 +45,7 @@ int SDL_timer_running = 0;
 Uint32 SDL_alarm_interval = 0;
 SDL_TimerCallback SDL_alarm_callback;
 
-static SDL_bool list_changed = SDL_FALSE;
+static volatile SDL_bool list_changed = SDL_FALSE;
 
 /* Data used for a thread-based timer */
 static int SDL_timer_threaded = 0;
@@ -114,6 +114,9 @@ void SDL_ThreadedTimerCheck(void)
 	Uint32 now, ms;
 	SDL_TimerID t, prev, next;
 	int removed;
+	SDL_NewTimerCallback callback;
+	Uint32 interval;
+	void *param;
 
 	now = SDL_GetTicks();
 
@@ -133,8 +136,11 @@ void SDL_ThreadedTimerCheck(void)
 			printf("Executing timer %p (thread = %d)\n",
 						t, SDL_ThreadID());
 #endif
+			callback = t->cb;
+			interval = t->interval;
+			param = t->param;
 			SDL_mutexV(SDL_timer_mutex);
-			ms = t->cb(t->interval, t->param);
+			ms = callback(interval, param);
 			SDL_mutexP(SDL_timer_mutex);
 			if ( list_changed ) {
 				/* Abort, list of timers has been modified */
-- 
2.18.1