forked from luck/tmp_suning_uos_patched
ixgbe: Don't allow user buffer count to exceed 256
If the user buffer count was 256 the shift would place a 1 in the offset region leading to errors. It also overwrites the uers buffer list. This patch makes sure that at most 256 user buffers are allowed for DDP and the buffer count is masked properly such that it doesn't overwrite the offset when shifting the bits. Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: Yi Zou <yi.zou@intel.com> Signed-off-by: Frank Zhang <frank_1.zhang@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e0fce6950b
commit
a7551b75fe
|
@ -202,6 +202,15 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
|
|||
addr = sg_dma_address(sg);
|
||||
len = sg_dma_len(sg);
|
||||
while (len) {
|
||||
/* max number of buffers allowed in one DDP context */
|
||||
if (j >= IXGBE_BUFFCNT_MAX) {
|
||||
netif_err(adapter, drv, adapter->netdev,
|
||||
"xid=%x:%d,%d,%d:addr=%llx "
|
||||
"not enough descriptors\n",
|
||||
xid, i, j, dmacount, (u64)addr);
|
||||
goto out_noddp_free;
|
||||
}
|
||||
|
||||
/* get the offset of length of current buffer */
|
||||
thisoff = addr & ((dma_addr_t)bufflen - 1);
|
||||
thislen = min((bufflen - thisoff), len);
|
||||
|
@ -227,20 +236,13 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
|
|||
len -= thislen;
|
||||
addr += thislen;
|
||||
j++;
|
||||
/* max number of buffers allowed in one DDP context */
|
||||
if (j > IXGBE_BUFFCNT_MAX) {
|
||||
DPRINTK(DRV, ERR, "xid=%x:%d,%d,%d:addr=%llx "
|
||||
"not enough descriptors\n",
|
||||
xid, i, j, dmacount, (u64)addr);
|
||||
goto out_noddp_free;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* only the last buffer may have non-full bufflen */
|
||||
lastsize = thisoff + thislen;
|
||||
|
||||
fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
|
||||
fcbuff |= (j << IXGBE_FCBUFF_BUFFCNT_SHIFT);
|
||||
fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
|
||||
fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
|
||||
fcbuff |= (IXGBE_FCBUFF_VALID);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user