Commit 71b57845 authored by Julia Lawall's avatar Julia Lawall Committed by Jean Delvare

i2c-smbus: Convert kzalloc to devm_kzalloc

Converting kzalloc to devm_kzalloc simplifies the code and ensures that the
result, alert, is freed after the irq allocated by the subsequent
devm_request_irq.  This in turn ensures that when an interrupt can be
triggered, the alert structure is still available.

The problem of a free after a devm_request_irq was found using the
following semantic match (http://coccinelle.lip6.fr/)

// <smpl>
@r exists@
expression e1,e2,x,a,b,c,d;
identifier free;
position p1,p2;
@@

  devm_request_irq@p1(e1,e2,...,x)
  ... when any
      when != e2 = a
      when != x = b
  if (...) {
    ... when != e2 = c
        when != x = d
    free@p2(...,x,...);
    ...
    return ...;
  }
// </smpl>
Signed-off-by: default avatarJulia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent eee543e8
...@@ -142,7 +142,8 @@ static int smbalert_probe(struct i2c_client *ara, ...@@ -142,7 +142,8 @@ static int smbalert_probe(struct i2c_client *ara,
struct i2c_adapter *adapter = ara->adapter; struct i2c_adapter *adapter = ara->adapter;
int res; int res;
alert = kzalloc(sizeof(struct i2c_smbus_alert), GFP_KERNEL); alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert),
GFP_KERNEL);
if (!alert) if (!alert)
return -ENOMEM; return -ENOMEM;
...@@ -154,10 +155,8 @@ static int smbalert_probe(struct i2c_client *ara, ...@@ -154,10 +155,8 @@ static int smbalert_probe(struct i2c_client *ara,
if (setup->irq > 0) { if (setup->irq > 0) {
res = devm_request_irq(&ara->dev, setup->irq, smbalert_irq, res = devm_request_irq(&ara->dev, setup->irq, smbalert_irq,
0, "smbus_alert", alert); 0, "smbus_alert", alert);
if (res) { if (res)
kfree(alert);
return res; return res;
}
} }
i2c_set_clientdata(ara, alert); i2c_set_clientdata(ara, alert);
...@@ -167,14 +166,12 @@ static int smbalert_probe(struct i2c_client *ara, ...@@ -167,14 +166,12 @@ static int smbalert_probe(struct i2c_client *ara,
return 0; return 0;
} }
/* IRQ resource is managed so it is freed automatically */ /* IRQ and memory resources are managed so they are freed automatically */
static int smbalert_remove(struct i2c_client *ara) static int smbalert_remove(struct i2c_client *ara)
{ {
struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); struct i2c_smbus_alert *alert = i2c_get_clientdata(ara);
cancel_work_sync(&alert->alert); cancel_work_sync(&alert->alert);
kfree(alert);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment