Skip to content

Commit

Permalink
macintosh: Don't assume i2c device probing always succeeds
Browse files Browse the repository at this point in the history
If i2c device probing fails, then there is no driver to dereference
after calling i2c_new_device(). Stop assuming that probing will always
succeed, to avoid NULL pointer dereferences. We have an easier access
to the driver anyway.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Tested-by: Tim Shepard <shep@alum.mit.edu>
Cc: Colin Leroy <colin@colino.net>
  • Loading branch information
Jean Delvare committed Oct 4, 2009
1 parent 18669ea commit 6f6b35e
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 5 deletions.
4 changes: 3 additions & 1 deletion drivers/macintosh/therm_adt746x.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ read_reg(struct thermostat* th, int reg)
return data;
}

static struct i2c_driver thermostat_driver;

static int
attach_thermostat(struct i2c_adapter *adapter)
{
Expand All @@ -148,7 +150,7 @@ attach_thermostat(struct i2c_adapter *adapter)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
list_add_tail(&client->detected, &client->driver->clients);
list_add_tail(&client->detected, &thermostat_driver.clients);
return 0;
}

Expand Down
4 changes: 3 additions & 1 deletion drivers/macintosh/therm_pm72.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,8 @@ struct fcu_fan_table fcu_fans[] = {
},
};

static struct i2c_driver therm_pm72_driver;

/*
* Utility function to create an i2c_client structure and
* attach it to one of u3 adapters
Expand Down Expand Up @@ -318,7 +320,7 @@ static struct i2c_client *attach_i2c_chip(int id, const char *name)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
list_add_tail(&clt->detected, &clt->driver->clients);
list_add_tail(&clt->detected, &therm_pm72_driver.clients);
return clt;
}

Expand Down
4 changes: 3 additions & 1 deletion drivers/macintosh/windfarm_lm75_sensor.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ static int wf_lm75_probe(struct i2c_client *client,
return rc;
}

static struct i2c_driver wf_lm75_driver;

static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter,
u8 addr, int ds1775,
const char *loc)
Expand Down Expand Up @@ -157,7 +159,7 @@ static struct i2c_client *wf_lm75_create(struct i2c_adapter *adapter,
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
list_add_tail(&client->detected, &client->driver->clients);
list_add_tail(&client->detected, &wf_lm75_driver.clients);
return client;
fail:
return NULL;
Expand Down
4 changes: 3 additions & 1 deletion drivers/macintosh/windfarm_max6690_sensor.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ static int wf_max6690_probe(struct i2c_client *client,
return rc;
}

static struct i2c_driver wf_max6690_driver;

static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter,
u8 addr, const char *loc)
{
Expand Down Expand Up @@ -119,7 +121,7 @@ static struct i2c_client *wf_max6690_create(struct i2c_adapter *adapter,
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
list_add_tail(&client->detected, &client->driver->clients);
list_add_tail(&client->detected, &wf_max6690_driver.clients);
return client;

fail:
Expand Down
4 changes: 3 additions & 1 deletion drivers/macintosh/windfarm_smu_sat.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ static struct wf_sensor_ops wf_sat_ops = {
.owner = THIS_MODULE,
};

static struct i2c_driver wf_sat_driver;

static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev)
{
struct i2c_board_info info;
Expand Down Expand Up @@ -222,7 +224,7 @@ static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev)
* Let i2c-core delete that device on driver removal.
* This is safe because i2c-core holds the core_lock mutex for us.
*/
list_add_tail(&client->detected, &client->driver->clients);
list_add_tail(&client->detected, &wf_sat_driver.clients);
}

static int wf_sat_probe(struct i2c_client *client,
Expand Down

0 comments on commit 6f6b35e

Please sign in to comment.