# HG changeset patch # User Sam Lantinga # Date 1296238918 28800 # Node ID d79ff339d1f2f92f87598b934a7b9eb635d2bd73 # Parent dc0dfdd58f27574224ab25bec9ff7dc523d5a044 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()? diff -r dc0dfdd58f27 -r d79ff339d1f2 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); }