IPoIB/cm: Partial error clean up unmaps wrong address
authorRalph Campbell <ralph.campbell@qlogic.com>
Fri, 29 Jun 2007 18:37:56 +0000 (11:37 -0700)
committerRoland Dreier <rolandd@cisco.com>
Tue, 3 Jul 2007 03:48:31 +0000 (20:48 -0700)
If a page can't be allocated for the frag list of a skb, the code to
unmap the partially allocated list is off by one.  For exaple, if
'frags' equals one, i == 0, and the alloc_page() fails, then the old
loop would have unmapped mapping[1] which is uninitialized.  The same
would happen if the call to ib_dma_map_page() failed.

Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Acked-by: Michael S. Tsirkin <mst@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_cm.c

index 5ffc464c99aa70318035252a7be60e5ba5cf876e..ea74d1eaf0046c15c78e6a819067b8743a572a71 100644 (file)
@@ -148,8 +148,8 @@ partial_error:
 
        ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
 
-       for (; i >= 0; --i)
-               ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
+       for (; i > 0; --i)
+               ib_dma_unmap_single(priv->ca, mapping[i], PAGE_SIZE, DMA_FROM_DEVICE);
 
        dev_kfree_skb_any(skb);
        return NULL;