Check the stdin poll() return value before reading

This commit is contained in:
Cameron Gutman 2016-01-05 19:53:23 -06:00
parent dc254e1ee5
commit 006ad72eb2

View File

@ -295,33 +295,49 @@ int main(int argc, char* argv[]) {
} }
while (pollres == 0); while (pollres == 0);
ret = fread(&requestId, sizeof(requestId), 1, stdin); if (pollres > 0 && (pollinfo.revents & POLLIN)) {
if (ret < sizeof(requestId)) { // We'll have data available now
__android_log_print(ANDROID_LOG_ERROR, "EvdevReader", "Short read on input"); ret = fread(&requestId, sizeof(requestId), 1, stdin);
return errno; if (ret < sizeof(requestId)) {
} __android_log_print(ANDROID_LOG_ERROR, "EvdevReader", "Short read on input");
return errno;
if (requestId != UNGRAB_REQ && requestId != REGRAB_REQ) {
__android_log_print(ANDROID_LOG_ERROR, "EvdevReader", "Unknown request");
return requestId;
}
{
struct DeviceEntry *currentEntry;
pthread_mutex_lock(&DeviceListLock);
// Update state for future devices
grabbing = (requestId == REGRAB_REQ);
// Carry out the requested action on each device
currentEntry = DeviceListHead;
while (currentEntry != NULL) {
ioctl(currentEntry->fd, EVIOCGRAB, grabbing);
currentEntry = currentEntry->next;
} }
pthread_mutex_unlock(&DeviceListLock); if (requestId != UNGRAB_REQ && requestId != REGRAB_REQ) {
__android_log_print(ANDROID_LOG_ERROR, "EvdevReader", "Unknown request");
return requestId;
}
{
struct DeviceEntry *currentEntry;
pthread_mutex_lock(&DeviceListLock);
// Update state for future devices
grabbing = (requestId == REGRAB_REQ);
// Carry out the requested action on each device
currentEntry = DeviceListHead;
while (currentEntry != NULL) {
ioctl(currentEntry->fd, EVIOCGRAB, grabbing);
currentEntry = currentEntry->next;
}
pthread_mutex_unlock(&DeviceListLock);
}
}
else {
// Terminate this thread
if (pollres < 0) {
__android_log_print(ANDROID_LOG_ERROR, "EvdevReader",
"Stdin poll() failed: %d", errno);
}
else {
__android_log_print(ANDROID_LOG_ERROR, "EvdevReader",
"Stdin unexpected revents: %d", pollinfo.revents);
}
return -1;
} }
} }
} }