drivers/net/can/sja1000/plx_pci.c: eliminate double free
commit951f2f960e5bbce20309de44626cf11d17847712
authorJulia Lawall <julia@diku.dk>
Mon, 8 Aug 2011 06:28:50 +0000 (8 06:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 14 Aug 2011 01:00:32 +0000 (13 18:00 -0700)
tree23b4a76dbb70f036e9b756c70205e5c740f9ce12
parent75bc8ef528f7c4ea7e80384c5593487b6b3b535e
drivers/net/can/sja1000/plx_pci.c: eliminate double free

In this code, the failure_cleanup label calls the function
plx_pci_del_card, which frees everything in the card->net_dev array.  dev
is placed in this array immediately after allocation, so the two subsequent
jumps to failure_cleanup should not also call free_sja1000dev, but the
second one does.

If plx_pci_check_sja1000 fails, then free_sja1000dev is also called on
dev.  Because dev is already in the card->net_dev array, this implies that
when plx_pci_del_card is later called, it may get freed again.  So that
entry is reset to NULL after the free.

Finally, if there is a problem with one channel, there will be a hole in the
array.  card->channels counts the number of channels that have succeeded,
and does not keep track of the index of the largest element in the array
that is valid.  So the loop in plx_pci_del_card is changed to go up to
PLX_PCI_MAX_CHAN, which is only 2.

Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/can/sja1000/plx_pci.c