Input: elants_i2c - fix division by zero if firmware reports zero phys size

Started by Dmitry Osipenko on Mar 2, 2021 · 5 messages from 3 authors · Last reply Mar 28, 2021

Subsystems (2)

Maintainers (2)

STALE2055d LANDED

Status: Landed in mainline as 781bab3238c2 on 2021-03-28.

open the first message on its own page

Message details and related content
Touchscreen firmware of ASUS Transformer TF700T reports zeros for the phys
size. Hence check whether the size is zero and don't set the resolution in
this case.

Reported-by: Jasper Korten <redacted>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Please note that ASUS TF700T isn't yet supported by upstream kernel,
hence this is not a critical fix.

 drivers/input/touchscreen/elants_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 4c2b579f6c8b..a2e1cc4192b0 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1441,14 +1441,16 @@ static int elants_i2c_probe(struct i2c_client *client,
 
 	touchscreen_parse_properties(ts->input, true, &ts->prop);
 
-	if (ts->chip_id == EKTF3624) {
+	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
 		/* calculate resolution from size */
 		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
 		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
 	}
 
-	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
-	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+	if (ts->x_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
+	if (ts->y_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
 	if (ts->major_res > 0)
 		input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res);
 
-- 
2.29.2
Message details and related content
On Tue, Mar 02, 2021 at 01:08:24PM +0300, Dmitry Osipenko wrote:
Touchscreen firmware of ASUS Transformer TF700T reports zeros for the phys
size. Hence check whether the size is zero and don't set the resolution in
this case.

Reported-by: Jasper Korten <redacted>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
Rewieved-by: Michał Mirosław [off-list ref]

quoted hunk
Please note that ASUS TF700T isn't yet supported by upstream kernel,
hence this is not a critical fix.

 drivers/input/touchscreen/elants_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 4c2b579f6c8b..a2e1cc4192b0 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1441,14 +1441,16 @@ static int elants_i2c_probe(struct i2c_client *client,
 
 	touchscreen_parse_properties(ts->input, true, &ts->prop);
 
-	if (ts->chip_id == EKTF3624) {
+	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
 		/* calculate resolution from size */
 		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
 		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
 	}
 
-	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
-	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+	if (ts->x_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
+	if (ts->y_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
I would guess that you can tie X and Y in one if, as they are unlikely
to work independently.

Best Regards
Michal Mirosław
Message details and related content
02.03.2021 13:08, Dmitry Osipenko пишет:
quoted hunk
Touchscreen firmware of ASUS Transformer TF700T reports zeros for the phys
size. Hence check whether the size is zero and don't set the resolution in
this case.

Reported-by: Jasper Korten <redacted>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Please note that ASUS TF700T isn't yet supported by upstream kernel,
hence this is not a critical fix.

 drivers/input/touchscreen/elants_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 4c2b579f6c8b..a2e1cc4192b0 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1441,14 +1441,16 @@ static int elants_i2c_probe(struct i2c_client *client,
 
 	touchscreen_parse_properties(ts->input, true, &ts->prop);
 
-	if (ts->chip_id == EKTF3624) {
+	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
 		/* calculate resolution from size */
 		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
 		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
 	}
 
-	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
-	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+	if (ts->x_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
+	if (ts->y_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
 	if (ts->major_res > 0)
 		input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res);
 
Hi,

This is a very minor fix, but still will be nice if we could get it into
5.13 in order to have one less patch to care about. Thanks in advance!
Message details and related content
Hi Dmitry,

On Tue, Mar 02, 2021 at 01:08:24PM +0300, Dmitry Osipenko wrote:
quoted hunk
Touchscreen firmware of ASUS Transformer TF700T reports zeros for the phys
size. Hence check whether the size is zero and don't set the resolution in
this case.

Reported-by: Jasper Korten <redacted>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Please note that ASUS TF700T isn't yet supported by upstream kernel,
hence this is not a critical fix.

 drivers/input/touchscreen/elants_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 4c2b579f6c8b..a2e1cc4192b0 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1441,14 +1441,16 @@ static int elants_i2c_probe(struct i2c_client *client,
 
 	touchscreen_parse_properties(ts->input, true, &ts->prop);
 
-	if (ts->chip_id == EKTF3624) {
+	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
 		/* calculate resolution from size */
 		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
 		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
 	}
 
-	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
-	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+	if (ts->x_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
There is absolutely no difference between setting respluton to 0 vs not
setting it at all, so I dropped the conditionals and applied.
quoted hunk
+	if (ts->y_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
 	if (ts->major_res > 0)
We could drop this condition as well.
 		input_abs_set_res(ts->input, ABS_MT_TOUCH_MAJOR, ts->major_res);
 
-- 
2.29.2
Thanks.

-- 
Dmitry
Message details and related content
28.03.2021 07:44, Dmitry Torokhov пишет:
Hi Dmitry,

On Tue, Mar 02, 2021 at 01:08:24PM +0300, Dmitry Osipenko wrote:
quoted
Touchscreen firmware of ASUS Transformer TF700T reports zeros for the phys
size. Hence check whether the size is zero and don't set the resolution in
this case.

Reported-by: Jasper Korten <redacted>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Please note that ASUS TF700T isn't yet supported by upstream kernel,
hence this is not a critical fix.

 drivers/input/touchscreen/elants_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 4c2b579f6c8b..a2e1cc4192b0 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1441,14 +1441,16 @@ static int elants_i2c_probe(struct i2c_client *client,
 
 	touchscreen_parse_properties(ts->input, true, &ts->prop);
 
-	if (ts->chip_id == EKTF3624) {
+	if (ts->chip_id == EKTF3624 && ts->phy_x && ts->phy_y) {
 		/* calculate resolution from size */
 		ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, ts->phy_x);
 		ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, ts->phy_y);
 	}
 
-	input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
-	input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+	if (ts->x_res > 0)
+		input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
There is absolutely no difference between setting respluton to 0 vs not
setting it at all, so I dropped the conditionals and applied.

7 more quoted lines

I'll make a follow up patch to clean up this condition, if you haven't
done it yet. Thanks!
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help