Commit a4948e3c authored by Patrice Mandin's avatar Patrice Mandin

Fix bug 545, by returning early whenever an error occurs when initializing joystick structure

--HG--
branch : SDL-1.2
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/branches/SDL-1.2%402925
parent 7bc2820d
...@@ -112,64 +112,67 @@ SDL_Joystick *SDL_JoystickOpen(int device_index) ...@@ -112,64 +112,67 @@ SDL_Joystick *SDL_JoystickOpen(int device_index)
/* Create and initialize the joystick */ /* Create and initialize the joystick */
joystick = (SDL_Joystick *)SDL_malloc((sizeof *joystick)); joystick = (SDL_Joystick *)SDL_malloc((sizeof *joystick));
if ( joystick != NULL ) { if ( !joystick ) {
SDL_memset(joystick, 0, (sizeof *joystick)); return(NULL);
joystick->index = device_index; }
if ( SDL_SYS_JoystickOpen(joystick) < 0 ) {
SDL_free(joystick); SDL_memset(joystick, 0, (sizeof *joystick));
joystick = NULL; joystick->index = device_index;
} else { if ( SDL_SYS_JoystickOpen(joystick) < 0 ) {
if ( joystick->naxes > 0 ) { SDL_free(joystick);
joystick->axes = (Sint16 *)SDL_malloc return(NULL);
(joystick->naxes*sizeof(Sint16)); }
}
if ( joystick->nhats > 0 ) { if ( joystick->naxes > 0 ) {
joystick->hats = (Uint8 *)SDL_malloc joystick->axes = (Sint16 *)SDL_malloc
(joystick->nhats*sizeof(Uint8)); (joystick->naxes*sizeof(Sint16));
}
if ( joystick->nballs > 0 ) {
joystick->balls = (struct balldelta *)SDL_malloc
(joystick->nballs*sizeof(*joystick->balls));
}
if ( joystick->nbuttons > 0 ) {
joystick->buttons = (Uint8 *)SDL_malloc
(joystick->nbuttons*sizeof(Uint8));
}
if ( ((joystick->naxes > 0) && !joystick->axes)
|| ((joystick->nhats > 0) && !joystick->hats)
|| ((joystick->nballs > 0) && !joystick->balls)
|| ((joystick->nbuttons > 0) && !joystick->buttons)) {
SDL_OutOfMemory();
SDL_JoystickClose(joystick);
joystick = NULL;
}
if ( joystick->axes ) {
SDL_memset(joystick->axes, 0,
joystick->naxes*sizeof(Sint16));
}
if ( joystick->hats ) {
SDL_memset(joystick->hats, 0,
joystick->nhats*sizeof(Uint8));
}
if ( joystick->balls ) {
SDL_memset(joystick->balls, 0,
joystick->nballs*sizeof(*joystick->balls));
}
if ( joystick->buttons ) {
SDL_memset(joystick->buttons, 0,
joystick->nbuttons*sizeof(Uint8));
}
}
} }
if ( joystick ) { if ( joystick->nhats > 0 ) {
/* Add joystick to list */ joystick->hats = (Uint8 *)SDL_malloc
++joystick->ref_count; (joystick->nhats*sizeof(Uint8));
SDL_Lock_EventThread();
for ( i=0; SDL_joysticks[i]; ++i )
/* Skip to next joystick */;
SDL_joysticks[i] = joystick;
SDL_Unlock_EventThread();
} }
if ( joystick->nballs > 0 ) {
joystick->balls = (struct balldelta *)SDL_malloc
(joystick->nballs*sizeof(*joystick->balls));
}
if ( joystick->nbuttons > 0 ) {
joystick->buttons = (Uint8 *)SDL_malloc
(joystick->nbuttons*sizeof(Uint8));
}
if ( ((joystick->naxes > 0) && !joystick->axes)
|| ((joystick->nhats > 0) && !joystick->hats)
|| ((joystick->nballs > 0) && !joystick->balls)
|| ((joystick->nbuttons > 0) && !joystick->buttons)) {
SDL_OutOfMemory();
SDL_JoystickClose(joystick);
return(NULL);
}
if ( joystick->axes ) {
SDL_memset(joystick->axes, 0,
joystick->naxes*sizeof(Sint16));
}
if ( joystick->hats ) {
SDL_memset(joystick->hats, 0,
joystick->nhats*sizeof(Uint8));
}
if ( joystick->balls ) {
SDL_memset(joystick->balls, 0,
joystick->nballs*sizeof(*joystick->balls));
}
if ( joystick->buttons ) {
SDL_memset(joystick->buttons, 0,
joystick->nbuttons*sizeof(Uint8));
}
/* Add joystick to list */
++joystick->ref_count;
SDL_Lock_EventThread();
for ( i=0; SDL_joysticks[i]; ++i )
/* Skip to next joystick */ ;
SDL_joysticks[i] = joystick;
SDL_Unlock_EventThread();
return(joystick); return(joystick);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment