diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2022-04-17 23:03:53 +0300 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2022-04-17 23:14:29 +0300 |
commit | eba697b3c30320933aeb19b0606c2099fe880e51 (patch) | |
tree | 6a703a35bdd9cca9d9441fc56c6f7d2b89e91227 /drivers/input | |
parent | e505edaedcb9e7d16eefddc62d2189afaea0febc (diff) | |
download | linux-eba697b3c30320933aeb19b0606c2099fe880e51.tar.xz |
Input: iqs7222 - propagate some error codes correctly
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>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/misc/iqs7222.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/input/misc/iqs7222.c b/drivers/input/misc/iqs7222.c index d800f71043a5..c0b273222092 100644 --- a/drivers/input/misc/iqs7222.c +++ b/drivers/input/misc/iqs7222.c @@ -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, |