batman-adv: check for tt_reponse packet real length
authorAntonio Quartulli <ordex@autistici.org>
Sun, 16 Oct 2011 18:32:03 +0000 (20:32 +0200)
committerSven Eckelmann <sven@narfation.org>
Sun, 20 Nov 2011 12:08:34 +0000 (13:08 +0100)
Before accessing the TT_RESPONSE packet payload, the node has to ensure that the
packet is long enough as it would expect to be.

Reported-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
net/batman-adv/routing.c

index e0e7b7b79ca9fa521375c2cd03efb4fa105fa5b9..ef24a7205f65beaf3737da6a5389798a5f2f6836 100644 (file)
@@ -578,6 +578,7 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
 {
        struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
        struct tt_query_packet *tt_query;
+       uint16_t tt_len;
        struct ethhdr *ethhdr;
 
        /* drop packet if it has not necessary minimum size */
@@ -622,6 +623,14 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
                        if (skb_linearize(skb) < 0)
                                goto out;
 
+                       tt_len = tt_query->tt_data * sizeof(struct tt_change);
+
+                       /* Ensure we have all the claimed data */
+                       if (unlikely(skb_headlen(skb) <
+                                       sizeof(struct tt_query_packet) +
+                                       tt_len))
+                               goto out;
+
                        handle_tt_response(bat_priv, tt_query);
                } else {
                        bat_dbg(DBG_TT, bat_priv,