Input: iqs7222 - propagate some error codes correctly
authorDan Carpenter <dan.carpenter@oracle.com>
Sun, 17 Apr 2022 20:03:53 +0000 (13:03 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 17 Apr 2022 20:14:29 +0000 (13:14 -0700)
If fwnode_property_count_u32() returns a negative error code then,
because of type promotion, the "count > ARRAY_SIZE(pins)" condition
will be true.  The negative "count" is type promoted to a high unsigned
size_t value.

That means the "else if (count < 0)" condition will always be false and
we don't print that error message or propagate the error code from
fwnode_property_count_u32() as intended.

Fix this by re-ordering the checks so that we check for negative first.

Fixes: e505edaedcb9 ("Input: add support for Azoteq IQS7222A/B/C")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Link: https://lore.kernel.org/r/20220412153954.GA15406@kili
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/misc/iqs7222.c

index d800f71..c0b2732 100644 (file)
@@ -1677,14 +1677,14 @@ static int iqs7222_parse_cycle(struct iqs7222_private *iqs7222, int cycle_index)
                return 0;
 
        count = fwnode_property_count_u32(cycle_node, "azoteq,tx-enable");
-       if (count > ARRAY_SIZE(pins)) {
-               dev_err(&client->dev, "Invalid number of %s CTx pins\n",
-                       fwnode_get_name(cycle_node));
-               return -EINVAL;
-       } else if (count < 0) {
+       if (count < 0) {
                dev_err(&client->dev, "Failed to count %s CTx pins: %d\n",
                        fwnode_get_name(cycle_node), count);
                return count;
+       } else if (count > ARRAY_SIZE(pins)) {
+               dev_err(&client->dev, "Invalid number of %s CTx pins\n",
+                       fwnode_get_name(cycle_node));
+               return -EINVAL;
        }
 
        error = fwnode_property_read_u32_array(cycle_node, "azoteq,tx-enable",
@@ -1807,16 +1807,16 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, int chan_index)
 
                count = fwnode_property_count_u32(chan_node,
                                                  "azoteq,rx-enable");
-               if (count > ARRAY_SIZE(pins)) {
-                       dev_err(&client->dev,
-                               "Invalid number of %s CRx pins\n",
-                               fwnode_get_name(chan_node));
-                       return -EINVAL;
-               } else if (count < 0) {
+               if (count < 0) {
                        dev_err(&client->dev,
                                "Failed to count %s CRx pins: %d\n",
                                fwnode_get_name(chan_node), count);
                        return count;
+               } else if (count > ARRAY_SIZE(pins)) {
+                       dev_err(&client->dev,
+                               "Invalid number of %s CRx pins\n",
+                               fwnode_get_name(chan_node));
+                       return -EINVAL;
                }
 
                error = fwnode_property_read_u32_array(chan_node,
@@ -1975,14 +1975,14 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
         * the specified resolution.
         */
        count = fwnode_property_count_u32(sldr_node, "azoteq,channel-select");
-       if (count < 3 || count > ARRAY_SIZE(chan_sel)) {
-               dev_err(&client->dev, "Invalid number of %s channels\n",
-                       fwnode_get_name(sldr_node));
-               return -EINVAL;
-       } else if (count < 0) {
+       if (count < 0) {
                dev_err(&client->dev, "Failed to count %s channels: %d\n",
                        fwnode_get_name(sldr_node), count);
                return count;
+       } else if (count < 3 || count > ARRAY_SIZE(chan_sel)) {
+               dev_err(&client->dev, "Invalid number of %s channels\n",
+                       fwnode_get_name(sldr_node));
+               return -EINVAL;
        }
 
        error = fwnode_property_read_u32_array(sldr_node,