Skip to content

Commit d19319a

Browse files
takeshi-yoshimuraDominik Brodowski
authored andcommitted
pcmcia: Fix resource leaks in yenta_probe() and _close()
There are some resource leaks in yenta_probe() and _close(). I fixed the following issues with some code cleanups. Thanks to Dominik's suggestions. On the error path in yenta_probe(): - a requested irq is not released - yenta_free_resources() and pci_set_drvdata(dev, NULL) are not called In yenta_close(): - kfree(sock) is not called - sock->base is always set to non-NULL when yenta_close() is called, therefore the check in yenta_close() is not necessary. Signed-off-by: Takeshi Yoshimura <[email protected]> Signed-off-by: Dominik Brodowski <[email protected]>
1 parent 2fb22a8 commit d19319a

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

drivers/pcmcia/yenta_socket.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -801,13 +801,13 @@ static void yenta_close(struct pci_dev *dev)
801801
else
802802
del_timer_sync(&sock->poll_timer);
803803

804-
if (sock->base)
805-
iounmap(sock->base);
804+
iounmap(sock->base);
806805
yenta_free_resources(sock);
807806

808807
pci_release_regions(dev);
809808
pci_disable_device(dev);
810809
pci_set_drvdata(dev, NULL);
810+
kfree(sock);
811811
}
812812

813813

@@ -1254,25 +1254,34 @@ static int yenta_probe(struct pci_dev *dev, const struct pci_device_id *id)
12541254

12551255
/* Register it with the pcmcia layer.. */
12561256
ret = pcmcia_register_socket(&socket->socket);
1257-
if (ret == 0) {
1258-
/* Add the yenta register attributes */
1259-
ret = device_create_file(&dev->dev, &dev_attr_yenta_registers);
1260-
if (ret == 0)
1261-
goto out;
1262-
1263-
/* error path... */
1264-
pcmcia_unregister_socket(&socket->socket);
1265-
}
1257+
if (ret)
1258+
goto free_irq;
1259+
1260+
/* Add the yenta register attributes */
1261+
ret = device_create_file(&dev->dev, &dev_attr_yenta_registers);
1262+
if (ret)
1263+
goto unregister_socket;
12661264

1265+
return ret;
1266+
1267+
/* error path... */
1268+
unregister_socket:
1269+
pcmcia_unregister_socket(&socket->socket);
1270+
free_irq:
1271+
if (socket->cb_irq)
1272+
free_irq(socket->cb_irq, socket);
1273+
else
1274+
del_timer_sync(&socket->poll_timer);
12671275
unmap:
12681276
iounmap(socket->base);
1277+
yenta_free_resources(socket);
12691278
release:
12701279
pci_release_regions(dev);
12711280
disable:
12721281
pci_disable_device(dev);
12731282
free:
1283+
pci_set_drvdata(dev, NULL);
12741284
kfree(socket);
1275-
out:
12761285
return ret;
12771286
}
12781287

0 commit comments

Comments
 (0)