diff options
author | Peter Wu <lekensteyn@gmail.com> | 2013-08-28 18:21:45 +0200 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2013-09-02 11:45:34 +0200 |
commit | 9bc63112c7c5caa9a86e4e5a09f56eff4286d8e3 (patch) | |
tree | 272c6cd6f4ea115ed3b69773185ccba05aa4d4a3 | |
parent | c511b7356460bf8818e0dcd85ed15cc7f765b701 (diff) | |
download | upower-9bc63112c7c5caa9a86e4e5a09f56eff4286d8e3.tar.gz |
hidpp: move timeout checking before reading
When no report matches the report type or device, the previous code
did not terminate the loop early enough because the check was missed.
Now the timeout is always checked before attempting to poll.
Signed-off-by: Peter Wu <lekensteyn@gmail.com>
-rw-r--r-- | src/linux/hidpp-device.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/linux/hidpp-device.c b/src/linux/hidpp-device.c index 03c7112..d714b46 100644 --- a/src/linux/hidpp-device.c +++ b/src/linux/hidpp-device.c @@ -394,6 +394,16 @@ hidpp_device_read_resp (HidppDevice *device, /* read from the device */ begin_time = g_get_monotonic_time () / 1000; for (;;) { + /* avoid infinite loop when there is no response */ + remaining_time = HIDPP_DEVICE_READ_RESPONSE_TIMEOUT - + (g_get_monotonic_time () / 1000 - begin_time); + if (remaining_time <= 0) { + g_set_error (error, 1, 0, + "timeout while reading response"); + ret = FALSE; + goto out; + } + r = g_poll (poll, G_N_ELEMENTS(poll), remaining_time); if (r < 0) { if (errno == EINTR) @@ -453,16 +463,6 @@ hidpp_device_read_resp (HidppDevice *device, goto out; } - /* avoid infinite loop when there is no response */ - remaining_time = HIDPP_DEVICE_READ_RESPONSE_TIMEOUT - - (g_get_monotonic_time () / 1000 - begin_time); - if (remaining_time <= 0) { - g_set_error (error, 1, 0, - "timeout while reading response"); - ret = FALSE; - goto out; - } - /* not our message, ignore it and try again */ } |