Skip to content

Commit

Permalink
dmascc: Return correct error codes
Browse files Browse the repository at this point in the history
This change has been made with the goal that kernel functions should
return something more descriptive than -1 on failure.

A variable `err` has been introduced for storing error codes.

The return value of kzalloc on failure should return a -1 and not a
-ENOMEM. This was found using Coccinelle. A simplified version of
the semantic patch used is:

//<smpl>
@@
expression *e;
identifier l1;
@@

e = kzalloc(...);
if (e == NULL) {
...
goto l1;
}
l1:
...
return -1
+ -ENOMEM
;
//</smpl

Furthermore, set `err` to -ENOMEM on failure of alloc_netdev(), and to
-ENODEV on failure of register_netdev() and probe_irq_off().

The single call site only checks that the return value is not 0,
hence no change is required at the call site.

Signed-off-by: Amitoj Kaur Chawla <amitoj1606@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Amitoj Kaur Chawla authored and David S. Miller committed Feb 16, 2016
1 parent 31d035a commit 37ace20
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/net/hamradio/dmascc.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ static const struct net_device_ops scc_netdev_ops = {

static int __init setup_adapter(int card_base, int type, int n)
{
int i, irq, chip;
int i, irq, chip, err;
struct scc_info *info;
struct net_device *dev;
struct scc_priv *priv;
Expand All @@ -463,14 +463,17 @@ static int __init setup_adapter(int card_base, int type, int n)

/* Initialize what is necessary for write_scc and write_scc_data */
info = kzalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA);
if (!info)
if (!info) {
err = -ENOMEM;
goto out;
}

info->dev[0] = alloc_netdev(0, "", NET_NAME_UNKNOWN, dev_setup);
if (!info->dev[0]) {
printk(KERN_ERR "dmascc: "
"could not allocate memory for %s at %#3x\n",
hw[type].name, card_base);
err = -ENOMEM;
goto out1;
}

Expand All @@ -479,6 +482,7 @@ static int __init setup_adapter(int card_base, int type, int n)
printk(KERN_ERR "dmascc: "
"could not allocate memory for %s at %#3x\n",
hw[type].name, card_base);
err = -ENOMEM;
goto out2;
}
spin_lock_init(&info->register_lock);
Expand Down Expand Up @@ -549,6 +553,7 @@ static int __init setup_adapter(int card_base, int type, int n)
printk(KERN_ERR
"dmascc: could not find irq of %s at %#3x (irq=%d)\n",
hw[type].name, card_base, irq);
err = -ENODEV;
goto out3;
}

Expand Down Expand Up @@ -585,11 +590,13 @@ static int __init setup_adapter(int card_base, int type, int n)
if (register_netdev(info->dev[0])) {
printk(KERN_ERR "dmascc: could not register %s\n",
info->dev[0]->name);
err = -ENODEV;
goto out3;
}
if (register_netdev(info->dev[1])) {
printk(KERN_ERR "dmascc: could not register %s\n",
info->dev[1]->name);
err = -ENODEV;
goto out4;
}

Expand All @@ -612,7 +619,7 @@ static int __init setup_adapter(int card_base, int type, int n)
out1:
kfree(info);
out:
return -1;
return err;
}


Expand Down

0 comments on commit 37ace20

Please sign in to comment.