diff options
author | Jean Delvare <khali@linux-fr.org> | 2008-08-10 16:56:16 -0400 |
---|---|---|
committer | Jean Delvare <khali@mahadeva.delvare> | 2008-08-10 16:56:16 -0400 |
commit | c1159f9e8927f5732c19816a605926bc76c498b2 (patch) | |
tree | d74732ca258661b744787d61a5402f8c8d5d9d9c /drivers/i2c | |
parent | 8d24f8dcb7ead491704e274883b2c627062f6235 (diff) |
i2c: Check for address business before creating clients
We check for address business in i2c_probe_address(),
i2c_detect_address() and i2c_new_probed_device(), but this isn't
sufficient. Drivers can call i2c_attach_client() and
i2c_new_device() on any address, so we must check the address there
as well.
This fixes bug #11239:
http://bugzilla.kernel.org/show_bug.cgi?id=11239
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index c16dcad94412..550853f79ae8 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -813,7 +813,12 @@ static int i2c_check_addr(struct i2c_adapter *adapter, int addr) | |||
813 | int i2c_attach_client(struct i2c_client *client) | 813 | int i2c_attach_client(struct i2c_client *client) |
814 | { | 814 | { |
815 | struct i2c_adapter *adapter = client->adapter; | 815 | struct i2c_adapter *adapter = client->adapter; |
816 | int res = 0; | 816 | int res; |
817 | |||
818 | /* Check for address business */ | ||
819 | res = i2c_check_addr(adapter, client->addr); | ||
820 | if (res) | ||
821 | return res; | ||
817 | 822 | ||
818 | client->dev.parent = &client->adapter->dev; | 823 | client->dev.parent = &client->adapter->dev; |
819 | client->dev.bus = &i2c_bus_type; | 824 | client->dev.bus = &i2c_bus_type; |