From 177d309b34762e1d4cab9528a92b999960dc94cc Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 28 Jan 2011 10:21:58 -0800 Subject: [PATCH] Fixed bug #1056 (Frequent crashes in Touch events by simply touching the screen) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Joseba GarcĂ­a Echebarria 2010-12-15 01:55:22 PST I believe the crash is caused by a check not being performed on wether an SDL_Touch element is NULL before using it in the SDL_SendTouchMotion function in src/events/SDL_touch.c around line 400. Judging from the rest of the code, there's a missing if (!touch) { return 0; } before using "touch" as SDL_GetFinger(), SDL_GetFingerIndexId() use touch->num_fingers without checking. I can attach a patch if you like. It seems pretty straightforward, though. I have yet to discover why touch is being returned as NULL as this error is only triggered when an actual gesture has been performed, maybe something related to SDL_AddTouch()? --- src/events/SDL_touch.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index c6bde97ba..07f0bfe11 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -397,15 +397,16 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, float xin, float yin, float pressurein) { int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(id); - SDL_Finger *finger = SDL_GetFinger(touch,fingerid); + SDL_Touch *touch; + SDL_Finger *finger; int posted; Sint16 xrel, yrel; float x_max = 0, y_max = 0; - Uint16 x; - Uint16 y; - Uint16 pressure; + Uint16 x; + Uint16 y; + Uint16 pressure; + touch = SDL_GetTouch(id); if (!touch) { return SDL_TouchNotFoundError(id); } @@ -418,6 +419,7 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, return 0; } + finger = SDL_GetFinger(touch,fingerid); if(finger == NULL || !finger->down) { return SDL_SendFingerDown(id,fingerid,SDL_TRUE,xin,yin,pressurein); } else { @@ -496,14 +498,16 @@ SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, int relative, return posted; } } + int SDL_SendTouchButton(SDL_TouchID id, Uint8 state, Uint8 button) { - SDL_Touch *touch = SDL_GetTouch(id); + SDL_Touch *touch; int posted; Uint32 type; + touch = SDL_GetTouch(id); if (!touch) { return SDL_TouchNotFoundError(id); }