Skip to content

Commit

Permalink
Fix bug 545, by returning early whenever an error occurs when initial…
Browse files Browse the repository at this point in the history
…izing joystick structure
  • Loading branch information
pmandin committed Jul 19, 2008
1 parent 2db12ed commit c1f7e7c
Showing 1 changed file with 59 additions and 56 deletions.
115 changes: 59 additions & 56 deletions src/joystick/SDL_joystick.c
Expand Up @@ -112,64 +112,67 @@ SDL_Joystick *SDL_JoystickOpen(int device_index)

/* Create and initialize the joystick */
joystick = (SDL_Joystick *)SDL_malloc((sizeof *joystick));
if ( joystick != NULL ) {
SDL_memset(joystick, 0, (sizeof *joystick));
joystick->index = device_index;
if ( SDL_SYS_JoystickOpen(joystick) < 0 ) {
SDL_free(joystick);
joystick = NULL;
} else {
if ( joystick->naxes > 0 ) {
joystick->axes = (Sint16 *)SDL_malloc
(joystick->naxes*sizeof(Sint16));
}
if ( joystick->nhats > 0 ) {
joystick->hats = (Uint8 *)SDL_malloc
(joystick->nhats*sizeof(Uint8));
}
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 ) {
return(NULL);
}

SDL_memset(joystick, 0, (sizeof *joystick));
joystick->index = device_index;
if ( SDL_SYS_JoystickOpen(joystick) < 0 ) {
SDL_free(joystick);
return(NULL);
}

if ( joystick->naxes > 0 ) {
joystick->axes = (Sint16 *)SDL_malloc
(joystick->naxes*sizeof(Sint16));
}
if ( joystick ) {
/* 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();
if ( joystick->nhats > 0 ) {
joystick->hats = (Uint8 *)SDL_malloc
(joystick->nhats*sizeof(Uint8));
}
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);
}

Expand Down

0 comments on commit c1f7e7c

Please sign in to comment.