Fixed bug #1056 (Frequent crashes in Touch events by simply touching the screen)
authorSam Lantinga <slouken@libsdl.org>
Fri, 28 Jan 2011 10:21:58 -0800
changeset 5124 d79ff339d1f2
parent 5123 dc0dfdd58f27
child 5125 b6c7a6b07ebf
Fixed bug #1056 (Frequent crashes in Touch events by simply touching the screen) 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
--- a/src/events/SDL_touch.c	Thu Jan 27 22:44:08 2011 -0800
+++ b/src/events/SDL_touch.c	Fri Jan 28 10:21:58 2011 -0800
@@ -397,15 +397,16 @@
                     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 @@
         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 @@
         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);
     }