]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Input: iqs7222 - protect against undefined slider size
authorJeff LaBundy <jeff@labundy.com>
Sun, 23 Oct 2022 00:57:00 +0000 (19:57 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:32:03 +0000 (13:32 +0100)
[ Upstream commit 2f6fd232978906f6fb054529210b9faec384bd45 ]

Select variants of silicon do not define a default slider size, in
which case the size must be specified in the device tree. If it is
not, the axis's maximum value is reported as 65535 due to unsigned
integer overflow.

To solve this problem, move the existing zero-check outside of the
conditional block that checks whether the property is present.

Fixes: e505edaedcb9 ("Input: add support for Azoteq IQS7222A/B/C")
Signed-off-by: Jeff LaBundy <jeff@labundy.com>
Link: https://lore.kernel.org/r/Y1SRXEi7XMlncDWk@nixie71
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/input/misc/iqs7222.c

index ddb863bf63eec22682058868e98be75938c075bb..32515946bbcaf0917c3e77ae9d00b79b95411e49 100644 (file)
@@ -2066,7 +2066,7 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
                sldr_setup[4 + reg_offset] -= 2;
 
        if (!fwnode_property_read_u32(sldr_node, "azoteq,slider-size", &val)) {
-               if (!val || val > dev_desc->sldr_res) {
+               if (val > dev_desc->sldr_res) {
                        dev_err(&client->dev, "Invalid %s size: %u\n",
                                fwnode_get_name(sldr_node), val);
                        return -EINVAL;
@@ -2081,6 +2081,13 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
                }
        }
 
+       if (!(reg_offset ? sldr_setup[3]
+                        : sldr_setup[2] & IQS7222_SLDR_SETUP_2_RES_MASK)) {
+               dev_err(&client->dev, "Undefined %s size\n",
+                       fwnode_get_name(sldr_node));
+               return -EINVAL;
+       }
+
        if (!fwnode_property_read_u32(sldr_node, "azoteq,top-speed", &val)) {
                if (val > (reg_offset ? U16_MAX : U8_MAX * 4)) {
                        dev_err(&client->dev, "Invalid %s top speed: %u\n",