Hi,
Please take a look and consider applying.
- Arnaldo
--- linux-2.4.0-test6/drivers/net/wan/cosa.c Thu Jul 13 01:58:43 2000
+++ linux-2.4.0-test6.acme/drivers/net/wan/cosa.c Fri Aug 11 14:11:00 2000
@@ -75,6 +75,8 @@
/*
* 5/25/1999 : Marcelo Tosatti <marcelo@conectiva.com.br>
* fixed a deadlock in cosa_sppp_open
+ * 8/11/2000 : Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ * check resource allocation on cosa_probe
*/
/* ---------- Headers, macros, data structures ---------- */
@@ -551,20 +553,23 @@
request_region(base, is_8bit(cosa)?2:4, cosa->type);
if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa))
goto bad1;
- if (request_dma(cosa->dma, cosa->type)) {
- free_irq(cosa->irq, cosa);
-bad1: release_region(cosa->datareg,is_8bit(cosa)?2:4);
- printk(KERN_NOTICE "cosa%d: allocating resources failed\n",
- cosa->num);
- return -1;
- }
+ if (request_dma(cosa->dma, cosa->type))
+ goto bad2;
cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL|GFP_DMA);
+
+ if (!cosa->bouncebuf)
+ goto bad3;
+
sprintf(cosa->name, "cosa%d", cosa->num);
/* Initialize the per-channel data */
cosa->chan = kmalloc(sizeof(struct channel_data)*cosa->nchannels,
GFP_KERNEL);
+
+ if (!cosa->chan)
+ goto bad4:
+
memset(cosa->chan, 0, sizeof(struct channel_data)*cosa->nchannels);
for (i=0; i<cosa->nchannels; i++) {
cosa->chan[i].cosa = cosa;
@@ -577,6 +582,13 @@
cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels);
return nr_cards++;
+
+bad4: kfree(cosa->bouncebuf);
+bad3: free_dma(cosa->dma);
+bad2: free_irq(cosa->irq, cosa);
+bad1: release_region(cosa->datareg,is_8bit(cosa)?2:4);
+ printk(KERN_NOTICE "cosa%d: allocating resources failed\n", cosa->num);
+ return -1;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Tue Aug 15 2000 - 21:00:24 EST