tipc: perform skb_linearize() before parsing the inner header
authorParthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com>
Thu, 24 Aug 2017 14:31:22 +0000 (16:31 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 25 Aug 2017 04:54:34 +0000 (21:54 -0700)
In tipc_rcv(), we linearize only the header and usually the packets
are consumed as the nodes permit direct reception. However, if the
skb contains tunnelled message due to fail over or synchronization
we parse it in tipc_node_check_state() without performing
linearization. This will cause link disturbances if the skb was
non linear.

In this commit, we perform linearization for the above messages.

Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/node.c

index 9b4dcb6a16b50eefc04167dfdd1e509546b71bf6..b113a52f8914b34e28ef2639a6637b503f14c90d 100644 (file)
@@ -1557,6 +1557,8 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b)
 
        /* Check/update node state before receiving */
        if (unlikely(skb)) {
+               if (unlikely(skb_linearize(skb)))
+                       goto discard;
                tipc_node_write_lock(n);
                if (tipc_node_check_state(n, skb, bearer_id, &xmitq)) {
                        if (le->link) {