The SDL forums have moved to discourse.libsdl.org.
This is just a read-only archive of the previous forums, to keep old links working.


SDL Forum Index
SDL
Simple Directmedia Layer Forums
Bugfix for Detection of Joystick Properties in SDL-1.2.14
Marr
Guest

Greetings,

I've joined this mailing list to report a bug in the 1.2.14 version of the SDL
library. But before I forget, let me say "Thank you!" to Sam Lantinga and to
everyone else who has contributed to this library. (I'm using it via DosBox.)

Problem Description:

On Slackware 13.1, which is running SDL 1.2.14, my CH Products 'F-16
Combatstick USB' joystick (USB VID/PID 068e/0504) was erroneously reporting
only 1 axis instead of 3 (and 0 "hats" instead of 1), as evidenced by this run
of the test app which comes with SDL:

==> testjoystick
There are 1 joysticks attached
Joystick 0: CH Products CH 3-Axis 10-Button+POV USB Joystick
axes: 1
balls: 0
hats: 0
buttons: 10

Also, activation of the "coolie hat" switch in any of the 4 positions would
cause an immediate segmentation fault.

As you can see from the name of the joystick, the reported button count (10)
is correct.

Solution:

After a few hours of scratching my head and testing, I eventually found the
bug. It occurs in this file:

joystick/linux/SDL_sysjoystick.c

Here's the offending code, with a bit of context:

if ( test_bit(i, absbit) ) {
int values[5];

if ( ioctl(fd, EVIOCGABS(i), values) < 0 )
continue;

On my 2.6.33.4 kernel, the structure that is used to pass the 'values' back is
defined in 'linux/input.h':

struct input_absinfo {
__s32 value;
__s32 minimum;
__s32 maximum;
__s32 fuzz;
__s32 flat;
__s32 resolution;
};

But the 'int values[5]' array is not large enough to hold it. On my system,
this causes the 'absbit[]' array to become corrupted, preventing detection of
any joystick axes after the first one. I suppose that the symptoms might be
different on other systems though, depending on compiler issues like alignment
or whatever.

A simple change of '5' to '6' makes my joystick report correctly once again
and, incidentally, seems to prevent the segmentation faults that were
occurring every time I activated the "coolie hat" switch on that joystick.

I see that others had similar problems which were undoubtedly a result of this
same bug. Examples:

http://lists.libsdl.org/pipermail/sdl-libsdl.org/2011-July/081657.html

http://lists.libsdl.org/pipermail/sdl-libsdl.org/2010-July/077212.html

With the fixed library installed, I now see the expected output for the 'F-16
Combatstick USB' joystick:

==> testjoystick
There are 1 joysticks attached
Joystick 0: CH Products CH 3-Axis 10-Button+POV USB Joystick
axes: 3
balls: 0
hats: 1
buttons: 10

All 3 axes (X, Y, and throttle wheel) and 1 hat are now detected -- excellent!

Note: I later discovered that a fix has already been made in the 1.3.x source
code. In fact, it was done in a more robust, future-proof manner than the
quick 'n' dirty fix I've suggested above. The 1.3.x source code smartly uses
the actual structure to define the receiving variable:

if (test_bit(i, absbit)) {
struct input_absinfo absinfo;

if (ioctl(fd, EVIOCGABS(i), &absinfo) < 0)
continue;

Can such a fix be put into the next 1.2.x release? Is there even going to be a
new 1.2.x release?

Again, my thanks to all who have contributed to this library. I hope some
sort of bug fix might make it into the 1.2.x library. Failing that, I hope
that the 1.3.x library comes out before the next official release of Slackware.
:^)

Hopefully, at a minimum, this bugfix report might save someone else the time I
spent chasing this down. I just wish I'd thought to run a 'diff' on the 1.2.14
and 1.3.x code before finding the bug the hard way! :^)

Regards,
Bill Marr
_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
Bugfix for Detection of Joystick Properties in SDL-1.2.14
Marr
Guest

A couple of points that I might have made clearer in my original post on this
bug:

(1) This bug only affects Linux users of SDL 1.2.x.

(2) This bug affects _all_ (Linux) joystick users (not just those with a CH
Products 'F-16 Combatstick USB' joystick). It undoubtedly affects (Linux)
gamepad users too.

Also, please note that I later discovered that this same bug (inadequate
storage allocation for the EVIOCGABS ioctl call) appears in the SDL 1.3 Linux
"touch" interface code, as described here:

http://forums.libsdl.org/viewtopic.php?p=30364#30364

Regards,
Bill Marr
_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org