summaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-10-05 11:50:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-10-05 11:50:15 -0400
commit9819a30c11ea439e5e3c81f5539c4d42d6c76314 (patch)
treeeee29b4735a2ddb944260ad3d281efd4a56788cc /net/tipc/link.c
parent6fe137cbe3e85e832a169006e8ccc04cec69c653 (diff)
parentef129d34149ea23d0d442844fc25ae26a85589fc (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from David Miller: 1) Fix ieeeu02154 atusb driver use-after-free, from Johan Hovold. 2) Need to validate TCA_CBQ_WRROPT netlink attributes, from Eric Dumazet. 3) txq null deref in mac80211, from Miaoqing Pan. 4) ionic driver needs to select NET_DEVLINK, from Arnd Bergmann. 5) Need to disable bh during nft_connlimit GC, from Pablo Neira Ayuso. 6) Avoid division by zero in taprio scheduler, from Vladimir Oltean. 7) Various xgmac fixes in stmmac driver from Jose Abreu. 8) Avoid 64-bit division in mlx5 leading to link errors on 32-bit from Michal Kubecek. 9) Fix bad VLAN check in rtl8366 DSA driver, from Linus Walleij. 10) Fix sleep while atomic in sja1105, from Vladimir Oltean. 11) Suspend/resume deadlock in stmmac, from Thierry Reding. 12) Various UDP GSO fixes from Josh Hunt. 13) Fix slab out of bounds access in tcp_zerocopy_receive(), from Eric Dumazet. 14) Fix OOPS in __ipv6_ifa_notify(), from David Ahern. 15) Memory leak in NFC's llcp_sock_bind, from Eric Dumazet. * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (72 commits) selftests/net: add nettest to .gitignore net: qlogic: Fix memory leak in ql_alloc_large_buffers nfc: fix memory leak in llcp_sock_bind() sch_dsmark: fix potential NULL deref in dsmark_init() net: phy: at803x: use operating parameters from PHY-specific status net: phy: extract pause mode net: phy: extract link partner advertisement reading net: phy: fix write to mii-ctrl1000 register ipv6: Handle missing host route in __ipv6_ifa_notify net: phy: allow for reset line to be tied to a sleepy GPIO controller net: ipv4: avoid mixed n_redirects and rate_tokens usage r8152: Set macpassthru in reset_resume callback cxgb4:Fix out-of-bounds MSI-X info array access Revert "ipv6: Handle race in addrconf_dad_work" net: make sock_prot_memory_pressure() return "const char *" rxrpc: Fix rxrpc_recvmsg tracepoint qmi_wwan: add support for Cinterion CLS8 devices tcp: fix slab-out-of-bounds in tcp_zerocopy_receive() lib: textsearch: fix escapes in example code udp: only do GSO if # of segs > 1 ...
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 6cc75ffd9e2c..999eab592de8 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -160,6 +160,7 @@ struct tipc_link {
160 struct { 160 struct {
161 u16 len; 161 u16 len;
162 u16 limit; 162 u16 limit;
163 struct sk_buff *target_bskb;
163 } backlog[5]; 164 } backlog[5];
164 u16 snd_nxt; 165 u16 snd_nxt;
165 u16 window; 166 u16 window;
@@ -880,6 +881,7 @@ static void link_prepare_wakeup(struct tipc_link *l)
880void tipc_link_reset(struct tipc_link *l) 881void tipc_link_reset(struct tipc_link *l)
881{ 882{
882 struct sk_buff_head list; 883 struct sk_buff_head list;
884 u32 imp;
883 885
884 __skb_queue_head_init(&list); 886 __skb_queue_head_init(&list);
885 887
@@ -901,11 +903,10 @@ void tipc_link_reset(struct tipc_link *l)
901 __skb_queue_purge(&l->deferdq); 903 __skb_queue_purge(&l->deferdq);
902 __skb_queue_purge(&l->backlogq); 904 __skb_queue_purge(&l->backlogq);
903 __skb_queue_purge(&l->failover_deferdq); 905 __skb_queue_purge(&l->failover_deferdq);
904 l->backlog[TIPC_LOW_IMPORTANCE].len = 0; 906 for (imp = 0; imp <= TIPC_SYSTEM_IMPORTANCE; imp++) {
905 l->backlog[TIPC_MEDIUM_IMPORTANCE].len = 0; 907 l->backlog[imp].len = 0;
906 l->backlog[TIPC_HIGH_IMPORTANCE].len = 0; 908 l->backlog[imp].target_bskb = NULL;
907 l->backlog[TIPC_CRITICAL_IMPORTANCE].len = 0; 909 }
908 l->backlog[TIPC_SYSTEM_IMPORTANCE].len = 0;
909 kfree_skb(l->reasm_buf); 910 kfree_skb(l->reasm_buf);
910 kfree_skb(l->reasm_tnlmsg); 911 kfree_skb(l->reasm_tnlmsg);
911 kfree_skb(l->failover_reasm_skb); 912 kfree_skb(l->failover_reasm_skb);
@@ -947,7 +948,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
947 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; 948 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1;
948 struct sk_buff_head *transmq = &l->transmq; 949 struct sk_buff_head *transmq = &l->transmq;
949 struct sk_buff_head *backlogq = &l->backlogq; 950 struct sk_buff_head *backlogq = &l->backlogq;
950 struct sk_buff *skb, *_skb, *bskb; 951 struct sk_buff *skb, *_skb, **tskb;
951 int pkt_cnt = skb_queue_len(list); 952 int pkt_cnt = skb_queue_len(list);
952 int rc = 0; 953 int rc = 0;
953 954
@@ -999,19 +1000,21 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
999 seqno++; 1000 seqno++;
1000 continue; 1001 continue;
1001 } 1002 }
1002 if (tipc_msg_bundle(skb_peek_tail(backlogq), hdr, mtu)) { 1003 tskb = &l->backlog[imp].target_bskb;
1004 if (tipc_msg_bundle(*tskb, hdr, mtu)) {
1003 kfree_skb(__skb_dequeue(list)); 1005 kfree_skb(__skb_dequeue(list));
1004 l->stats.sent_bundled++; 1006 l->stats.sent_bundled++;
1005 continue; 1007 continue;
1006 } 1008 }
1007 if (tipc_msg_make_bundle(&bskb, hdr, mtu, l->addr)) { 1009 if (tipc_msg_make_bundle(tskb, hdr, mtu, l->addr)) {
1008 kfree_skb(__skb_dequeue(list)); 1010 kfree_skb(__skb_dequeue(list));
1009 __skb_queue_tail(backlogq, bskb); 1011 __skb_queue_tail(backlogq, *tskb);
1010 l->backlog[msg_importance(buf_msg(bskb))].len++; 1012 l->backlog[imp].len++;
1011 l->stats.sent_bundled++; 1013 l->stats.sent_bundled++;
1012 l->stats.sent_bundles++; 1014 l->stats.sent_bundles++;
1013 continue; 1015 continue;
1014 } 1016 }
1017 l->backlog[imp].target_bskb = NULL;
1015 l->backlog[imp].len += skb_queue_len(list); 1018 l->backlog[imp].len += skb_queue_len(list);
1016 skb_queue_splice_tail_init(list, backlogq); 1019 skb_queue_splice_tail_init(list, backlogq);
1017 } 1020 }
@@ -1027,6 +1030,7 @@ static void tipc_link_advance_backlog(struct tipc_link *l,
1027 u16 seqno = l->snd_nxt; 1030 u16 seqno = l->snd_nxt;
1028 u16 ack = l->rcv_nxt - 1; 1031 u16 ack = l->rcv_nxt - 1;
1029 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; 1032 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1;
1033 u32 imp;
1030 1034
1031 while (skb_queue_len(&l->transmq) < l->window) { 1035 while (skb_queue_len(&l->transmq) < l->window) {
1032 skb = skb_peek(&l->backlogq); 1036 skb = skb_peek(&l->backlogq);
@@ -1037,7 +1041,10 @@ static void tipc_link_advance_backlog(struct tipc_link *l,
1037 break; 1041 break;
1038 __skb_dequeue(&l->backlogq); 1042 __skb_dequeue(&l->backlogq);
1039 hdr = buf_msg(skb); 1043 hdr = buf_msg(skb);
1040 l->backlog[msg_importance(hdr)].len--; 1044 imp = msg_importance(hdr);
1045 l->backlog[imp].len--;
1046 if (unlikely(skb == l->backlog[imp].target_bskb))
1047 l->backlog[imp].target_bskb = NULL;
1041 __skb_queue_tail(&l->transmq, skb); 1048 __skb_queue_tail(&l->transmq, skb);
1042 /* next retransmit attempt */ 1049 /* next retransmit attempt */
1043 if (link_is_bc_sndlink(l)) 1050 if (link_is_bc_sndlink(l))