diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-03-13 14:49:51 +0100 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-03-20 12:12:55 +1000 |
commit | 6de3b75c453e4687b21f6d6acfcf87e7041c4fc5 (patch) | |
tree | 3cca8025bb8d1259b51dbf5b649edc753f0e29af | |
parent | a976a85aeff4f2511544c0385533d9387957afae (diff) |
Use jstkCloseDevice_* on error in jstkOpenDevice_* backend functions
This is a preparation patch for adding support for server managed fds, this
also fixes a missing free() in an error handling path in the evdev back-end.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | src/backend_bsd.c | 18 | ||||
-rw-r--r-- | src/backend_evdev.c | 27 | ||||
-rw-r--r-- | src/backend_joystick.c | 12 |
3 files changed, 22 insertions, 35 deletions
diff --git a/src/backend_bsd.c b/src/backend_bsd.c index c6ce7b4..9fa3035 100644 --- a/src/backend_bsd.c +++ b/src/backend_bsd.c @@ -100,29 +100,27 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe) if ((rd = hid_get_report_desc(joystick->fd)) == 0) { xf86Msg(X_ERROR, "Joystick: hid_get_report_desc failed: %s\n", strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_bsd(joystick); return -1; } if (ioctl(joystick->fd, USB_GET_REPORT_ID, &report_id) < 0) { xf86Msg(X_ERROR, "Joystick: ioctl USB_GET_REPORT_ID failed: %s\n", strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_bsd(joystick); return -1; } bsddata = (struct jstk_bsd_hid_data*) malloc(sizeof(struct jstk_bsd_hid_data)); + joystick->devicedata = (void*) bsddata; + bsddata->dlen = hid_report_size(rd, hid_input, report_id); if ((bsddata->data_buf = malloc(bsddata->dlen)) == NULL) { fprintf(stderr, "error: couldn't malloc %d bytes\n", bsddata->dlen); hid_dispose_report_desc(rd); - free(bsddata); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_bsd(joystick); return -1; } @@ -181,14 +179,11 @@ jstkOpenDevice_bsd(JoystickDevPtr joystick, Bool probe) if (!got_something) { free(bsddata->data_buf); xf86Msg(X_ERROR, "Joystick: Didn't find any usable axes.\n"); - free(bsddata); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_bsd(joystick); return -1; } bsddata->hotdata = 0; - joystick->devicedata = (void*) bsddata; if (probe == TRUE) { xf86Msg(X_INFO, "Joystick: %d buttons, %d axes\n", joystick->num_buttons, joystick->num_axes); @@ -222,6 +217,7 @@ jstkCloseDevice_bsd(JoystickDevPtr joystick) if (((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf) free(((struct jstk_bsd_hid_data*)joystick->devicedata)->data_buf); free(joystick->devicedata); + joystick->devicedata = NULL; } } diff --git a/src/backend_evdev.c b/src/backend_evdev.c index ca0b2e0..6d6f644 100644 --- a/src/backend_evdev.c +++ b/src/backend_evdev.c @@ -99,16 +99,14 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe) if (ioctl(joystick->fd, EVIOCGVERSION, &driver_version) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGVERSION on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_evdev(joystick); return -1; } if (ioctl(joystick->fd, EVIOCGID, &id) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGID on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_evdev(joystick); return -1; } @@ -118,13 +116,14 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe) { xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGBIT on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_evdev(joystick); return -1; } evdevdata = (struct jstk_evdev_data*) malloc(sizeof(struct jstk_evdev_data)); + joystick->devicedata = (void*) evdevdata; + for (axes=0; axes<ABS_MAX; axes++) { evdevdata->axis[axes].number = -1; @@ -144,9 +143,7 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe) if (ioctl(joystick->fd, EVIOCGABS(j), &absinfo) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGABS on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; - free(evdevdata); + jstkCloseDevice_evdev(joystick); return -1; } evdevdata->axis[j].number = axes; /* physical -> logical mapping */ @@ -163,8 +160,7 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe) { xf86Msg(X_ERROR, "Joystick: ioctl EVIOCGBIT on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_evdev(joystick); return -1; } buttons = 0; /* Our logical index */ @@ -191,7 +187,6 @@ jstkOpenDevice_evdev(JoystickDevPtr joystick, Bool probe) joystick->open_proc = jstkOpenDevice_evdev; joystick->read_proc = jstkReadData_evdev; joystick->close_proc = jstkCloseDevice_evdev; - joystick->devicedata = (void*) evdevdata; if (buttons > MAXBUTTONS) buttons = MAXBUTTONS; @@ -217,12 +212,12 @@ jstkCloseDevice_evdev(JoystickDevPtr joystick) { if ((joystick->fd >= 0)) { xf86CloseSerial(joystick->fd); - if (joystick->devicedata) { - free(joystick->devicedata); - joystick->devicedata = NULL; - } joystick->fd = -1; } + if (joystick->devicedata) { + free(joystick->devicedata); + joystick->devicedata = NULL; + } } diff --git a/src/backend_joystick.c b/src/backend_joystick.c index e61d908..c84654e 100644 --- a/src/backend_joystick.c +++ b/src/backend_joystick.c @@ -82,8 +82,7 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe) if (ioctl(joystick->fd, JSIOCGVERSION, &driver_version) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGVERSION on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_joystick(joystick); return -1; } if ((driver_version >> 16) < 1) { @@ -96,24 +95,21 @@ jstkOpenDevice_joystick(JoystickDevPtr joystick, Bool probe) if (ioctl(joystick->fd, JSIOCGAXES, &axes) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGAXES on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_joystick(joystick); return -1; } if (ioctl(joystick->fd, JSIOCGBUTTONS, &buttons) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGBUTTONS on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_joystick(joystick); return -1; } if (ioctl(joystick->fd, JSIOCGNAME(128), joy_name) == -1) { xf86Msg(X_ERROR, "Joystick: ioctl JSIOCGNAME on '%s' failed: %s\n", joystick->device, strerror(errno)); - close(joystick->fd); - joystick->fd = -1; + jstkCloseDevice_joystick(joystick); return -1; } |