Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1494329

Re: [PATCH 1/4] Input: elan_i2c - fix return tests of i2c_smbus_read_block_data()

From Dmitry Torokhov <dmitry.torokhov@gmail.com>
Newsgroups linux.kernel
Subject Re: [PATCH 1/4] Input: elan_i2c - fix return tests of i2c_smbus_read_block_data()
Date 2016-10-01 02:10 +0200
Message-ID <sng2l-GS-1@gated-at.bofh.it> (permalink)
References <smobD-7Vs-3@gated-at.bofh.it> <smobD-7Vs-11@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Wed, Sep 28, 2016 at 04:34:01PM +0200, Benjamin Tissoires wrote:
> i2c_smbus_read_block_data() returns negative errno else the number of
> data bytes in the slave's response.
> 
> Checking for error not null means the function always fails if the device
> answers properly.
> 
> So given that we read 3 bytes and access those, better check that we
> actually read those 3 bytes.
> 
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> ---
>  drivers/input/mouse/elan_i2c_smbus.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/input/mouse/elan_i2c_smbus.c b/drivers/input/mouse/elan_i2c_smbus.c
> index cb6aecb..9b43b55 100644
> --- a/drivers/input/mouse/elan_i2c_smbus.c
> +++ b/drivers/input/mouse/elan_i2c_smbus.c
> @@ -226,7 +226,7 @@ static int elan_smbus_get_max(struct i2c_client *client,
>  	u8 val[3];
>  
>  	error = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
> -	if (error) {
> +	if (error != 3) {
>  		dev_err(&client->dev, "failed to get dimensions: %d\n", error);
>  		return error;

Unfortunately that means you'll report success if you get 0 from
i2c_smbus_read_block_data() or confuse upper layers with positive
errors. I'll change this to:

	ret = i2c_smbus_read_block_data();
	if (ret != 3) {
		error = ret < 0 ? ret : -EIO;
		...
	}

Thanks.

>  	}
> @@ -245,7 +245,7 @@ static int elan_smbus_get_resolution(struct i2c_client *client,
>  
>  	error = i2c_smbus_read_block_data(client,
>  					  ETP_SMBUS_RESOLUTION_CMD, val);
> -	if (error) {
> +	if (error != 3) {
>  		dev_err(&client->dev, "failed to get resolution: %d\n", error);
>  		return error;
>  	}
> @@ -265,7 +265,7 @@ static int elan_smbus_get_num_traces(struct i2c_client *client,
>  
>  	error = i2c_smbus_read_block_data(client,
>  					  ETP_SMBUS_XY_TRACENUM_CMD, val);
> -	if (error) {
> +	if (error != 3) {
>  		dev_err(&client->dev, "failed to get trace info: %d\n", error);
>  		return error;
>  	}
> -- 
> 2.7.4
> 

-- 
Dmitry

Back to linux.kernel | Previous | NextPrevious in thread | Find similar | Unroll thread


Thread

[PATCH 1/4] Input: elan_i2c - fix return tests of i2c_smbus_read_block_data() Benjamin Tissoires <benjamin.tissoires@redhat.com> - 2016-09-28 16:40 +0200
  Re: [PATCH 1/4] Input: elan_i2c - fix return tests of  i2c_smbus_read_block_data() Dmitry Torokhov <dmitry.torokhov@gmail.com> - 2016-10-01 02:10 +0200

csiph-web