> > I believe this code also leaks earlier instances of port, which are only > > referenced by card_ptr, which is freed in the error handling code at the > > end of the function. A lot of operations are done on port on each > > iteration, however, so I'm not sure whether it is good enough to just free > > them. Perhaps there is some way to call ioc3uart_remove? > > > > Yes you are right, there should be something like this for out4: > > out4: > for (phys_port = 0; phys_port < PORTS_PER_CARD; phys_port++) { > port = card_ptr->ic_port[phys_port].icp_port; > if (port) { > pci_free_consistent(port->ip_idd->pdev, > TOTAL_RING_BUF_SIZE, > (void *)port->ip_cpu_ringbuf, > port->ip_dma_ringbuf); > kfree(port); > } > } > kfree(card_ptr); > return ret; Actually, pci_alloc_consistent is only called when phys_port is 0. In the subsequent cases, the ip_dma_ringbuf field is just initialized to the previous value. So it could be: out4: for (phys_port = 0; phys_port < PORTS_PER_CARD; phys_port++) { port = card_ptr->ic_port[phys_port].icp_port; if (port) { if (phys_port == 0) pci_free_consistent(port->ip_idd->pdev, TOTAL_RING_BUF_SIZE, (void *)port->ip_cpu_ringbuf, port->ip_dma_ringbuf); kfree(port); } } kfree(card_ptr); return ret; julia