2.6.x kernels & PCI-to-PCMCIA bridges [again]

Russell King rmk+pcmcia at arm.linux.org.uk
Wed May 5 23:01:23 BST 2004


On Wed, May 05, 2004 at 10:47:05AM +0300, jar wrote:
> komujun at nifty.com wrote:
> > linux/drivers/pcmcia/rsrc_mgr.c in 2.6.x is rewritten,
> > and not same as rsrc_mgr.c in 2.4.x.
> > 
> > The PD6729 driver works properly 
> > if you remove SS_CAP_PAGE_REGS from the pd6729.c.
> > This suggests find_mem_region has some problem 
> > and can not find proper memory region.
> 
> I have already do that. The PD6729 driver _is_ _working_ very well and
> it should be added to the kernel sources I think.

It's still buggy.  Here's some further comments:

+       for (i = 0; i < MAX_SOCKETS; i++) {
+               sockets[i] = kmalloc(sizeof(struct pd6729_socket), GFP_KERNEL);
+               memset(sockets[i], 0, sizeof(*sockets[i]));
+               if (!sockets[i])
+                       return -ENOMEM;
+       }

1. This allocates "MAX_SOCKETS" worth of data.  If any allocation fails,
   we oops the kernel due to a NULL pointer dereference.
2. If we somehow miss that, we leak memory because we haven't freed the
   sockets that we have been able to allocate.
3. sockets[] is a global static array.  If we ever encounter a machine
   which has two PCI device/functions whose device/vendor IDs are matched
   by this driver, we will overwrite this array. *BAD*.

+       if ((ret = pci_enable_device(dev)))
+               return ret;

We're leaking memory we allocated above.

Can someone provide me with the output of 'lspci' of a system using
this cardbus bridge please?

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core



More information about the linux-pcmcia mailing list