diff mbox

hotkey: only process reads of hotkey events that are at least the correct length

Message ID 1431603197-7965-1-git-send-email-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King May 14, 2015, 11:33 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Coverity Scan found an issue where the comparison to the event structure was
incorrect when reads were too short in size.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/hotkey/hotkey/hotkey.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

Comments

Alex Hung May 21, 2015, 10:52 p.m. UTC | #1
On 05/14/2015 04:33 AM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
> 
> Coverity Scan found an issue where the comparison to the event structure was
> incorrect when reads were too short in size.
> 
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  src/hotkey/hotkey/hotkey.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/src/hotkey/hotkey/hotkey.c b/src/hotkey/hotkey/hotkey.c
> index 6e40df1..28d3ef1 100644
> --- a/src/hotkey/hotkey/hotkey.c
> +++ b/src/hotkey/hotkey/hotkey.c
> @@ -90,20 +90,20 @@ static int hotkey_test(fwts_framework *fw, char *dev, fwts_list *hotkeys)
>  	}
>  
>  	while (do_test) {
> -		switch (read(fd, &ev, sizeof(ev))) {
> -		case -1:
> -		case 0:
> +		ssize_t ret = read(fd, &ev, sizeof(ev));
> +
> +		if (ret < (ssize_t)sizeof(ev)) {
>  			do_test = 0;
>  			break;
> -		default:
> -			if ((ev.type == EV_KEY) &&
> -		 	    (ev.code == KEY_ESC) &&
> -			    (ev.value == 0))
> -				do_test = 0;
> -			else
> -				hotkey_check_key(fw, &ev, hotkeys);
> -			break;
>  		}
> +
> +		if ((ev.type == EV_KEY) &&
> +		    (ev.code == KEY_ESC) &&
> +		    (ev.value == 0))
> +			do_test = 0;
> +		else
> +			hotkey_check_key(fw, &ev, hotkeys);
> +		break;
>  	}
>  
>  	if (ioctl(fd, EVIOCGRAB, (void*)0)) {	/* Release */
> 

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu May 29, 2015, 6:48 a.m. UTC | #2
On 2015年05月14日 19:33, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Coverity Scan found an issue where the comparison to the event structure was
> incorrect when reads were too short in size.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/hotkey/hotkey/hotkey.c | 22 +++++++++++-----------
>   1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/src/hotkey/hotkey/hotkey.c b/src/hotkey/hotkey/hotkey.c
> index 6e40df1..28d3ef1 100644
> --- a/src/hotkey/hotkey/hotkey.c
> +++ b/src/hotkey/hotkey/hotkey.c
> @@ -90,20 +90,20 @@ static int hotkey_test(fwts_framework *fw, char *dev, fwts_list *hotkeys)
>   	}
>   
>   	while (do_test) {
> -		switch (read(fd, &ev, sizeof(ev))) {
> -		case -1:
> -		case 0:
> +		ssize_t ret = read(fd, &ev, sizeof(ev));
> +
> +		if (ret < (ssize_t)sizeof(ev)) {
>   			do_test = 0;
>   			break;
> -		default:
> -			if ((ev.type == EV_KEY) &&
> -		 	    (ev.code == KEY_ESC) &&
> -			    (ev.value == 0))
> -				do_test = 0;
> -			else
> -				hotkey_check_key(fw, &ev, hotkeys);
> -			break;
>   		}
> +
> +		if ((ev.type == EV_KEY) &&
> +		    (ev.code == KEY_ESC) &&
> +		    (ev.value == 0))
> +			do_test = 0;
> +		else
> +			hotkey_check_key(fw, &ev, hotkeys);
> +		break;
>   	}
>   
>   	if (ioctl(fd, EVIOCGRAB, (void*)0)) {	/* Release */
Acked-by: Ivan Hu<ivan.hu@canonical.com>
diff mbox

Patch

diff --git a/src/hotkey/hotkey/hotkey.c b/src/hotkey/hotkey/hotkey.c
index 6e40df1..28d3ef1 100644
--- a/src/hotkey/hotkey/hotkey.c
+++ b/src/hotkey/hotkey/hotkey.c
@@ -90,20 +90,20 @@  static int hotkey_test(fwts_framework *fw, char *dev, fwts_list *hotkeys)
 	}
 
 	while (do_test) {
-		switch (read(fd, &ev, sizeof(ev))) {
-		case -1:
-		case 0:
+		ssize_t ret = read(fd, &ev, sizeof(ev));
+
+		if (ret < (ssize_t)sizeof(ev)) {
 			do_test = 0;
 			break;
-		default:
-			if ((ev.type == EV_KEY) &&
-		 	    (ev.code == KEY_ESC) &&
-			    (ev.value == 0))
-				do_test = 0;
-			else
-				hotkey_check_key(fw, &ev, hotkeys);
-			break;
 		}
+
+		if ((ev.type == EV_KEY) &&
+		    (ev.code == KEY_ESC) &&
+		    (ev.value == 0))
+			do_test = 0;
+		else
+			hotkey_check_key(fw, &ev, hotkeys);
+		break;
 	}
 
 	if (ioctl(fd, EVIOCGRAB, (void*)0)) {	/* Release */