Showing error 1787

User: Jiri Slaby
Error type: Invalid Pointer Dereference
Error type description: A pointer which is invalid is being dereferenced
File location: drivers/atm/eni.c
Line in file: 485
Project: Linux Kernel
Project version: 2.6.28
Tools: Smatch (1.59)
Entered: 2013-09-11 08:47:26 UTC


Source:

 455        dma[j-2] |= MID_DMA_END;
 456        j = j >> 1;
 457        dma_wr = eni_in(MID_DMA_WR_RX);
 458        dma_rd = eni_in(MID_DMA_RD_RX);
 459        /*
 460         * Can I move the dma_wr pointer by 2j+1 positions without overwriting
 461         * data that hasn't been read (position of dma_rd) yet ?
 462         */
 463        if (!NEPMOK(dma_wr,j+j+1,dma_rd,NR_DMA_RX)) { /* @@@ +1 is ugly */
 464                printk(KERN_WARNING DEV_LABEL "(itf %d): RX DMA full\n",
 465                    vcc->dev->number);
 466                goto trouble;
 467        }
 468        for (i = 0; i < j; i++) {
 469                writel(dma[i*2],eni_dev->rx_dma+dma_wr*8);
 470                writel(dma[i*2+1],eni_dev->rx_dma+dma_wr*8+4);
 471                dma_wr = (dma_wr+1) & (NR_DMA_RX-1);
 472        }
 473        if (skb) {
 474                ENI_PRV_POS(skb) = eni_vcc->descr+size+1;
 475                skb_queue_tail(&eni_dev->rx_queue,skb);
 476                eni_vcc->last = skb;
 477rx_enqueued++;
 478        }
 479        eni_vcc->descr = here;
 480        eni_out(dma_wr,MID_DMA_WR_RX);
 481        return 0;
 482
 483trouble:
 484        if (paddr)
 485                pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
 486                    PCI_DMA_FROMDEVICE);
 487        if (skb) dev_kfree_skb_irq(skb);
 488        return -1;
 489}
 490
 491
 492static void discard(struct atm_vcc *vcc,unsigned long size)
 493{
 494        struct eni_vcc *eni_vcc;
 495
Show full sources