Matteo Beniamino Pressing a trigger button on a Steam Controller causes a segmentation fault both with stable version and latest mercurial head on Linux. I'm using the recent hid_steam kernel module with lizard_mode disabled (that is no keyboard/mouse emulation). I suspect this is what's happening: the driver exposes two hats. The two hats have indices 0 and 2. Inside linux/SDL_sysjoystick.c two hats are allocated in allocate_hatdata for joystick->hwdata->hats. In HandleHat function the hat parameter (that can be 2) is directly used as the index of the array that only has two elements, causing an out of bounds access. SDL is not expecting to have "holes" between hats indices. The index 2 is calculated in HandleInputEvents() as (ABS_HAT2X - ABS_HAT0X) / 2 where ABS_HAT2X is the value associated to the hat inside the hid_steam module.
71 lines
2 KiB
C
71 lines
2 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
|
|
#ifndef SDL_sysjoystick_c_h_
|
|
#define SDL_sysjoystick_c_h_
|
|
|
|
#include <linux/input.h>
|
|
|
|
struct SDL_joylist_item;
|
|
|
|
/* The private structure used to keep track of a joystick */
|
|
struct joystick_hwdata
|
|
{
|
|
int fd;
|
|
struct SDL_joylist_item *item;
|
|
SDL_JoystickGUID guid;
|
|
char *fname; /* Used in haptic subsystem */
|
|
|
|
SDL_bool ff_rumble;
|
|
SDL_bool ff_sine;
|
|
struct ff_effect effect;
|
|
|
|
/* The current Linux joystick driver maps hats to two axes */
|
|
struct hwdata_hat
|
|
{
|
|
int axis[2];
|
|
} *hats;
|
|
/* The current Linux joystick driver maps balls to two axes */
|
|
struct hwdata_ball
|
|
{
|
|
int axis[2];
|
|
} *balls;
|
|
|
|
/* Support for the Linux 2.4 unified input interface */
|
|
Uint8 key_map[KEY_MAX];
|
|
Uint8 abs_map[ABS_MAX];
|
|
struct axis_correct
|
|
{
|
|
int used;
|
|
int coef[3];
|
|
} abs_correct[ABS_MAX];
|
|
|
|
int fresh;
|
|
|
|
/* Steam Controller support */
|
|
SDL_bool m_bSteamController;
|
|
/* 4 = (ABS_HAT3X-ABS_HAT0X)/2 (see input-event-codes.h in kernel) */
|
|
int hats_indices[4];
|
|
};
|
|
|
|
#endif /* SDL_sysjoystick_c_h_ */
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|