diff options
author | Andre Eisenbach <eisenbach@google.com> | 2016-05-30 12:00:46 -0700 |
---|---|---|
committer | Andre Eisenbach <eisenbach@google.com> | 2016-05-30 19:11:16 +0000 |
commit | 32d66694e9f782a0e9dfa423015284a573f8975c (patch) | |
tree | e10bb2e657c786412081cfc4129fff8e14949624 | |
parent | 6834570262116974a176cd8598b6d0ca6d031aca (diff) | |
download | bt-32d66694e9f782a0e9dfa423015284a573f8975c.tar.gz |
HID: Check for EINTR in uhid_event() and fix return value evaluation
uhid_event() returns 0 in the normal case. Commit 3a2c2d61
results in the polling thread to be exited.
Bug: 28942565
Change-Id: Id0aff2958bc7c2704ba340aa0ff7848afb8dcf80
-rw-r--r-- | btif/co/bta_hh_co.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/btif/co/bta_hh_co.c b/btif/co/bta_hh_co.c index 07258be3e..c95a19dc9 100644 --- a/btif/co/bta_hh_co.c +++ b/btif/co/bta_hh_co.c @@ -16,26 +16,25 @@ * ******************************************************************************/ -//#if (defined(BTA_HH_INCLUDED) && (BTA_HH_INCLUDED == TRUE)) - +#include <assert.h> #include <ctype.h> +#include <errno.h> #include <fcntl.h> -#include <sys/poll.h> +#include <linux/uhid.h> #include <pthread.h> #include <stdio.h> #include <string.h> #include <stdint.h> -#include <errno.h> -#include <unistd.h> -#include <linux/uhid.h> +#include <sys/poll.h> #include <unistd.h> + +#include "btcore/include/bdaddr.h" #include "osi/include/osi.h" -#include "btif_hh.h" #include "bta_api.h" #include "bta_hh_api.h" -#include "btif_util.h" #include "bta_hh_co.h" -#include "btcore/include/bdaddr.h" +#include "btif_hh.h" +#include "btif_util.h" const char *dev_path = "/dev/uhid"; @@ -61,8 +60,8 @@ void uhid_set_non_blocking(int fd) static int uhid_write(int fd, const struct uhid_event *ev) { ssize_t ret; - OSI_NO_INTR(ret = write(fd, ev, sizeof(*ev))); + if (ret < 0){ int rtn = -errno; APPL_TRACE_ERROR("%s: Cannot write to uhid:%s", @@ -78,17 +77,16 @@ static int uhid_write(int fd, const struct uhid_event *ev) } /* Internal function to parse the events received from UHID driver*/ -static int uhid_event(btif_hh_device_t *p_dev) +static int uhid_read_event(btif_hh_device_t *p_dev) { + assert(p_dev); + struct uhid_event ev; - ssize_t ret; memset(&ev, 0, sizeof(ev)); - if(!p_dev) - { - APPL_TRACE_ERROR("%s: Device not found",__FUNCTION__) - return -1; - } - ret = read(p_dev->fd, &ev, sizeof(ev)); + + ssize_t ret; + OSI_NO_INTR(ret = read(p_dev->fd, &ev, sizeof(ev))); + if (ret == 0) { APPL_TRACE_ERROR("%s: Read HUP on uhid-cdev %s", __FUNCTION__, strerror(errno)); @@ -217,8 +215,8 @@ static void *btif_hh_poll_event_thread(void *arg) } if (pfds[0].revents & POLLIN) { APPL_TRACE_DEBUG("%s: POLLIN", __func__); - ret = uhid_event(p_dev); - if (ret != -EINTR) + ret = uhid_read_event(p_dev); + if (ret != 0) break; } } |