Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 21 Dec 2018 22:21:17 +0000 (14:21 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 21 Dec 2018 22:21:17 +0000 (14:21 -0800)
Pull more networking fixes from David Miller:
 "Some more bug fixes have trickled in, we have:

  1) Local MAC entries properly in mscc driver, from Allan W. Nielsen.

  2) Eric Dumazet found some more of the typical "pskb_may_pull() -->
     oops forgot to reload the header pointer" bugs in ipv6 tunnel
     handling.

  3) Bad SKB socket pointer in ipv6 fragmentation handling, from Herbert
     Xu.

  4) Overflow fix in sk_msg_clone(), from Vakul Garg.

  5) Validate address lengths in AF_PACKET, from Willem de Bruijn"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  qmi_wwan: Fix qmap header retrieval in qmimux_rx_fixup
  qmi_wwan: Add support for Fibocom NL678 series
  tls: Do not call sk_memcopy_from_iter with zero length
  ipv6: tunnels: fix two use-after-free
  Prevent overflow of sk_msg in sk_msg_clone()
  packet: validate address length
  net: netxen: fix a missing check and an uninitialized use
  tcp: fix a race in inet_diag_dump_icsk()
  MAINTAINERS: update cxgb4 and cxgb3 maintainer
  ipv6: frags: Fix bogus skb->sk in reassembled packets
  mscc: Configured MAC entries should be locked.

MAINTAINERS
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
drivers/net/usb/qmi_wwan.c
net/core/skmsg.c
net/ipv4/inet_diag.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_vti.c
net/ipv6/reassembly.c
net/packet/af_packet.c
net/tls/tls_sw.c

index 842b697a1511521c0cc997ce8efa91586e781441..f3a5c97e34196680db3be6e92db9386155a33b7d 100644 (file)
@@ -4057,7 +4057,7 @@ S:        Maintained
 F:     drivers/media/dvb-frontends/cxd2820r*
 
 CXGB3 ETHERNET DRIVER (CXGB3)
-M:     Santosh Raspatur <santosh@chelsio.com>
+M:     Arjun Vynipadath <arjun@chelsio.com>
 L:     netdev@vger.kernel.org
 W:     http://www.chelsio.com
 S:     Supported
@@ -4086,7 +4086,7 @@ S:        Supported
 F:     drivers/crypto/chelsio
 
 CXGB4 ETHERNET DRIVER (CXGB4)
-M:     Ganesh Goudar <ganeshgr@chelsio.com>
+M:     Arjun Vynipadath <arjun@chelsio.com>
 L:     netdev@vger.kernel.org
 W:     http://www.chelsio.com
 S:     Supported
index 3238b9ee42f3fe467ba4532de67b1fc2fe5c0ef3..c84074fa4c954e781393df510ad6c9e6b4759d99 100644 (file)
@@ -747,7 +747,7 @@ static int ocelot_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
        }
 
        return ocelot_mact_learn(ocelot, port->chip_port, addr, vid,
-                                ENTRYTYPE_NORMAL);
+                                ENTRYTYPE_LOCKED);
 }
 
 static int ocelot_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
index 0ea141ece19ea14c02e79300d8aefe249b0db3ee..6547a9dd59355459251e92cd724f8f879fcf8bc7 100644 (file)
@@ -1125,7 +1125,8 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
                return -EINVAL;
        }
        val = nx_get_bios_version(adapter);
-       netxen_rom_fast_read(adapter, NX_BIOS_VERSION_OFFSET, (int *)&bios);
+       if (netxen_rom_fast_read(adapter, NX_BIOS_VERSION_OFFSET, (int *)&bios))
+               return -EIO;
        if ((__force u32)val != bios) {
                dev_err(&pdev->dev, "%s: firmware bios is incompatible\n",
                                fw_name[fw_type]);
index c8872dd5ff5e1808f36352bf618736ed20068e91..774e1ff01c9a9e3e3297360cc46d199ee9c90f40 100644 (file)
@@ -151,17 +151,18 @@ static bool qmimux_has_slaves(struct usbnet *dev)
 
 static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 {
-       unsigned int len, offset = sizeof(struct qmimux_hdr);
+       unsigned int len, offset = 0;
        struct qmimux_hdr *hdr;
        struct net_device *net;
        struct sk_buff *skbn;
+       u8 qmimux_hdr_sz = sizeof(*hdr);
 
-       while (offset < skb->len) {
-               hdr = (struct qmimux_hdr *)skb->data;
+       while (offset + qmimux_hdr_sz < skb->len) {
+               hdr = (struct qmimux_hdr *)(skb->data + offset);
                len = be16_to_cpu(hdr->pkt_len);
 
                /* drop the packet, bogus length */
-               if (offset + len > skb->len)
+               if (offset + len + qmimux_hdr_sz > skb->len)
                        return 0;
 
                /* control packet, we do not know what to do */
@@ -176,7 +177,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
                        return 0;
                skbn->dev = net;
 
-               switch (skb->data[offset] & 0xf0) {
+               switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) {
                case 0x40:
                        skbn->protocol = htons(ETH_P_IP);
                        break;
@@ -188,12 +189,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
                        goto skip;
                }
 
-               skb_put_data(skbn, skb->data + offset, len);
+               skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, len);
                if (netif_rx(skbn) != NET_RX_SUCCESS)
                        return 0;
 
 skip:
-               offset += len + sizeof(struct qmimux_hdr);
+               offset += len + qmimux_hdr_sz;
        }
        return 1;
 }
@@ -1265,6 +1266,7 @@ static const struct usb_device_id products[] = {
        {QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)}, /* Quectel EC21 Mini PCIe */
        {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */
        {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)},    /* Quectel BG96 */
+       {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */
 
        /* 4. Gobi 1000 devices */
        {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},    /* Acer Gobi Modem Device */
index 56a99d0c9aa08db3bc294e129aa571325bd335cb..b7dbb3c976cd2932b52ddf9fbc8a2f724ca423f0 100644 (file)
@@ -94,6 +94,9 @@ int sk_msg_clone(struct sock *sk, struct sk_msg *dst, struct sk_msg *src,
        }
 
        while (len) {
+               if (sk_msg_full(dst))
+                       return -ENOSPC;
+
                sge_len = sge->length - off;
                sge_off = sge->offset + off;
                if (sge_len > len)
index 4e5bc4b2f14e6786ceb7d63e5902f8fc17819dfa..1a4e9ff02762ed757545da13de1ee352f38c867b 100644 (file)
@@ -998,7 +998,9 @@ next_chunk:
                        if (!inet_diag_bc_sk(bc, sk))
                                goto next_normal;
 
-                       sock_hold(sk);
+                       if (!refcount_inc_not_zero(&sk->sk_refcnt))
+                               goto next_normal;
+
                        num_arr[accum] = num;
                        sk_arr[accum] = sk;
                        if (++accum == SKARR_SZ)
index a9d06d4dd05784b9f3d6e492ac3f395ed6a234d6..99179b9c83840bb730a27e7391c9e7f67d043cf1 100644 (file)
@@ -901,6 +901,7 @@ static int ipxip6_rcv(struct sk_buff *skb, u8 ipproto,
                        goto drop;
                if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
                        goto drop;
+               ipv6h = ipv6_hdr(skb);
                if (!ip6_tnl_rcv_ctl(t, &ipv6h->daddr, &ipv6h->saddr))
                        goto drop;
                if (iptunnel_pull_header(skb, 0, tpi->proto, false))
index eeaf7455d51e52f12b62ffd0c1c82e2ee09e4fc1..706fe42e4928990c84ba157496628d14803f7199 100644 (file)
@@ -318,6 +318,7 @@ static int vti6_rcv(struct sk_buff *skb)
                        return 0;
                }
 
+               ipv6h = ipv6_hdr(skb);
                if (!ip6_tnl_rcv_ctl(t, &ipv6h->daddr, &ipv6h->saddr)) {
                        t->dev->stats.rx_dropped++;
                        rcu_read_unlock();
index aa26c45486d94ab2f2f9f443b837642d8b582f83..a5bb59ee50acc4b813765a61dab5fd030ea089dd 100644 (file)
@@ -384,6 +384,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
                if (skb_try_coalesce(head, fp, &headstolen, &delta)) {
                        kfree_skb_partial(fp, headstolen);
                } else {
+                       fp->sk = NULL;
                        if (!skb_shinfo(head)->frag_list)
                                skb_shinfo(head)->frag_list = fp;
                        head->data_len += fp->len;
index 6655793765b2d255d051e8d892601c861c43cd72..5dda263b4a0a12e05c90329bfda18fc24a0c1de7 100644 (file)
@@ -2627,6 +2627,8 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
                proto   = saddr->sll_protocol;
                addr    = saddr->sll_addr;
                dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex);
+               if (addr && dev && saddr->sll_halen < dev->addr_len)
+                       goto out;
        }
 
        err = -ENXIO;
@@ -2825,6 +2827,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
                proto   = saddr->sll_protocol;
                addr    = saddr->sll_addr;
                dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex);
+               if (addr && dev && saddr->sll_halen < dev->addr_len)
+                       goto out;
        }
 
        err = -ENXIO;
index 7b1af8b59cd20e56841c437aa97d981fa89be864..29b27858fff10e2ec7a45b5a5f40841223e93ded 100644 (file)
@@ -935,10 +935,12 @@ fallback_to_reg_send:
                                    tls_ctx->tx.overhead_size);
                }
 
-               ret = sk_msg_memcopy_from_iter(sk, &msg->msg_iter, msg_pl,
-                                              try_to_copy);
-               if (ret < 0)
-                       goto trim_sgl;
+               if (try_to_copy) {
+                       ret = sk_msg_memcopy_from_iter(sk, &msg->msg_iter,
+                                                      msg_pl, try_to_copy);
+                       if (ret < 0)
+                               goto trim_sgl;
+               }
 
                /* Open records defined only if successfully copied, otherwise
                 * we would trim the sg but not reset the open record frags.