Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
IB/iser: Support iSCSI PDU padding
IBiser: Fix wrong mask when sizeof (dma_addr_t) > sizeof (unsigned long)
IPoIB: Fix possible NULL dereference in ipoib_start_xmit()

+14 -8
+5 -3
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 717 717 { 718 718 struct ipoib_dev_priv *priv = netdev_priv(dev); 719 719 struct ipoib_neigh *neigh; 720 - struct neighbour *n; 720 + struct neighbour *n = NULL; 721 721 unsigned long flags; 722 722 723 - n = dst_get_neighbour(skb_dst(skb)); 724 - if (likely(skb_dst(skb) && n)) { 723 + if (likely(skb_dst(skb))) 724 + n = dst_get_neighbour(skb_dst(skb)); 725 + 726 + if (likely(n)) { 725 727 if (unlikely(!*to_ipoib_neigh(n))) { 726 728 ipoib_path_lookup(skb, dev); 727 729 return NETDEV_TX_OK;
+7 -3
drivers/infiniband/ulp/iser/iscsi_iser.c
··· 101 101 102 102 /* verify PDU length */ 103 103 datalen = ntoh24(hdr->dlength); 104 - if (datalen != rx_data_len) { 105 - printk(KERN_ERR "iscsi_iser: datalen %d (hdr) != %d (IB) \n", 106 - datalen, rx_data_len); 104 + if (datalen > rx_data_len || (datalen + 4) < rx_data_len) { 105 + iser_err("wrong datalen %d (hdr), %d (IB)\n", 106 + datalen, rx_data_len); 107 107 rc = ISCSI_ERR_DATALEN; 108 108 goto error; 109 109 } 110 + 111 + if (datalen != rx_data_len) 112 + iser_dbg("aligned datalen (%d) hdr, %d (IB)\n", 113 + datalen, rx_data_len); 110 114 111 115 /* read AHS */ 112 116 ahslen = hdr->hlength * 4;
+1 -1
drivers/infiniband/ulp/iser/iscsi_iser.h
··· 89 89 } while (0) 90 90 91 91 #define SHIFT_4K 12 92 - #define SIZE_4K (1UL << SHIFT_4K) 92 + #define SIZE_4K (1ULL << SHIFT_4K) 93 93 #define MASK_4K (~(SIZE_4K-1)) 94 94 95 95 /* support up to 512KB in one RDMA */
+1 -1
drivers/infiniband/ulp/iser/iser_initiator.c
··· 412 412 memcpy(iser_conn->ib_conn->login_buf, task->data, 413 413 task->data_count); 414 414 tx_dsg->addr = iser_conn->ib_conn->login_dma; 415 - tx_dsg->length = data_seg_len; 415 + tx_dsg->length = task->data_count; 416 416 tx_dsg->lkey = device->mr->lkey; 417 417 mdesc->num_sge = 2; 418 418 }