Skip to content

Commit 34f35f8

Browse files
Mian Yousaf Kaukabcminyard
authored andcommitted
ipmi: ssif: initialize ssif_info->client early
During probe ssif_info->client is dereferenced in error path. However, it is set when some of the error checking has already been done. This causes following kernel crash if an error path is taken: [ 30.645593][ T674] ipmi_ssif 0-000e: ipmi_ssif: Not probing, Interface already present [ 30.657616][ T674] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000088 ... [ 30.657723][ T674] pc : __dev_printk+0x28/0xa0 [ 30.657732][ T674] lr : _dev_err+0x7c/0xa0 ... [ 30.657772][ T674] Call trace: [ 30.657775][ T674] __dev_printk+0x28/0xa0 [ 30.657778][ T674] _dev_err+0x7c/0xa0 [ 30.657781][ T674] ssif_probe+0x548/0x900 [ipmi_ssif 62ce4b08badc1458fd896206d9ef69a3c31f3d3e] [ 30.657791][ T674] i2c_device_probe+0x37c/0x3c0 ... Initialize ssif_info->client before any error path can be taken. Clear i2c_client data in the error path to prevent the dangling pointer from leaking. Fixes: c4436c9 ("ipmi_ssif: avoid registering duplicate ssif interface") Cc: [email protected] # 5.4.x Suggested-by: Takashi Iwai <[email protected]> Signed-off-by: Mian Yousaf Kaukab <[email protected]> Message-Id: <[email protected]> Signed-off-by: Corey Minyard <[email protected]>
1 parent 12119cf commit 34f35f8

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

drivers/char/ipmi/ipmi_ssif.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,6 +1659,9 @@ static int ssif_probe(struct i2c_client *client, const struct i2c_device_id *id)
16591659
}
16601660
}
16611661

1662+
ssif_info->client = client;
1663+
i2c_set_clientdata(client, ssif_info);
1664+
16621665
rv = ssif_check_and_remove(client, ssif_info);
16631666
/* If rv is 0 and addr source is not SI_ACPI, continue probing */
16641667
if (!rv && ssif_info->addr_source == SI_ACPI) {
@@ -1679,9 +1682,6 @@ static int ssif_probe(struct i2c_client *client, const struct i2c_device_id *id)
16791682
ipmi_addr_src_to_str(ssif_info->addr_source),
16801683
client->addr, client->adapter->name, slave_addr);
16811684

1682-
ssif_info->client = client;
1683-
i2c_set_clientdata(client, ssif_info);
1684-
16851685
/* Now check for system interface capabilities */
16861686
msg[0] = IPMI_NETFN_APP_REQUEST << 2;
16871687
msg[1] = IPMI_GET_SYSTEM_INTERFACE_CAPABILITIES_CMD;
@@ -1881,6 +1881,7 @@ static int ssif_probe(struct i2c_client *client, const struct i2c_device_id *id)
18811881

18821882
dev_err(&ssif_info->client->dev,
18831883
"Unable to start IPMI SSIF: %d\n", rv);
1884+
i2c_set_clientdata(client, NULL);
18841885
kfree(ssif_info);
18851886
}
18861887
kfree(resp);

0 commit comments

Comments
 (0)