From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dima Zavin Subject: [PATCH 1/3] input: evdev: only allow reading events if a full packet is present Date: Fri, 16 Dec 2011 10:07:04 -0800 Message-ID: <1324058826-12891-1-git-send-email-dima@android.com> Return-path: Received: from mail-ey0-f202.google.com ([209.85.215.202]:60441 "EHLO mail-ey0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755002Ab1LPSHL (ORCPT ); Fri, 16 Dec 2011 13:07:11 -0500 Received: by eaad1 with SMTP id d1so96364eaa.1 for ; Fri, 16 Dec 2011 10:07:10 -0800 (PST) Sender: linux-input-owner@vger.kernel.org List-Id: linux-input@vger.kernel.org To: Dmitry Torokhov Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Dima Zavin , Jeff Brown Without this, it was possible for the reader to get ahead of packet_head. If the the input device generated a partial packet *right* after the reader got ahead, then we can get into a situation where the device is marked readable but read always returns 0 until the next packet is finished (i.e a SYN is generated by the input driver). This situation can also happen if we overflow the buffer while a reader is trying to read an event out. Cc: Jeff Brown Signed-off-by: Dima Zavin --- drivers/input/evdev.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 4cf2534..03344b3 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -369,7 +369,7 @@ static int evdev_fetch_next_event(struct evdev_client *client, spin_lock_irq(&client->buffer_lock); - have_event = client->head != client->tail; + have_event = client->packet_head != client->tail; if (have_event) { *event = client->buffer[client->tail++]; client->tail &= client->bufsize - 1; -- 1.7.3.1