Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf5f18d7 authored by Aniroop Mathur's avatar Aniroop Mathur Committed by Dmitry Torokhov
Browse files

Input: evdev - fix bug in checking duplicate clock change request



clk_type and clkid stores different predefined clock identification
values so they cannot be compared for checking duplicate clock change
request. Therefore, lets fix it to avoid unexpected results.

Signed-off-by: default avatarAniroop Mathur <a.mathur@samsung.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 5523662e
Loading
Loading
Loading
Loading
+19 −17
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ struct evdev_client {
	struct fasync_struct *fasync;
	struct evdev *evdev;
	struct list_head node;
	int clk_type;
	unsigned int clk_type;
	bool revoked;
	unsigned long *evmasks[EV_CNT];
	unsigned int bufsize;
@@ -191,25 +191,26 @@ static void evdev_queue_syn_dropped(struct evdev_client *client)
static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid)
{
	unsigned long flags;

	if (client->clk_type == clkid)
		return 0;
	unsigned int clk_type;

	switch (clkid) {

	case CLOCK_REALTIME:
		client->clk_type = EV_CLK_REAL;
		clk_type = EV_CLK_REAL;
		break;
	case CLOCK_MONOTONIC:
		client->clk_type = EV_CLK_MONO;
		clk_type = EV_CLK_MONO;
		break;
	case CLOCK_BOOTTIME:
		client->clk_type = EV_CLK_BOOT;
		clk_type = EV_CLK_BOOT;
		break;
	default:
		return -EINVAL;
	}

	if (client->clk_type != clk_type) {
		client->clk_type = clk_type;

		/*
		 * Flush pending events and queue SYN_DROPPED event,
		 * but only if the queue is not empty.
@@ -222,6 +223,7 @@ static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid)
		}

		spin_unlock_irqrestore(&client->buffer_lock, flags);
	}

	return 0;
}