Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2294eb5 authored by David S. Miller's avatar David S. Miller
Browse files

Merge tag 'batman-adv-fix-for-davem' of git://git.open-mesh.org/linux-merge



Antonio Quartulli says:

====================
pull request net: batman-adv 2014-08-04

this is a pull request intended for net.

It just contains a patch by Sven Eckelmann that fixes the
reception of out-of-order fragments. As explained in the
commit message, the issue was due to a wrong assumption
about hlist_for_each_entry() in batadv_frag_insert_packet().
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4f933f41 d9124268
Loading
Loading
Loading
Loading
+7 −3
Original line number Original line Diff line number Diff line
@@ -128,6 +128,7 @@ static bool batadv_frag_insert_packet(struct batadv_orig_node *orig_node,
{
{
	struct batadv_frag_table_entry *chain;
	struct batadv_frag_table_entry *chain;
	struct batadv_frag_list_entry *frag_entry_new = NULL, *frag_entry_curr;
	struct batadv_frag_list_entry *frag_entry_new = NULL, *frag_entry_curr;
	struct batadv_frag_list_entry *frag_entry_last = NULL;
	struct batadv_frag_packet *frag_packet;
	struct batadv_frag_packet *frag_packet;
	uint8_t bucket;
	uint8_t bucket;
	uint16_t seqno, hdr_size = sizeof(struct batadv_frag_packet);
	uint16_t seqno, hdr_size = sizeof(struct batadv_frag_packet);
@@ -180,11 +181,14 @@ static bool batadv_frag_insert_packet(struct batadv_orig_node *orig_node,
			ret = true;
			ret = true;
			goto out;
			goto out;
		}
		}

		/* store current entry because it could be the last in list */
		frag_entry_last = frag_entry_curr;
	}
	}


	/* Reached the end of the list, so insert after 'frag_entry_curr'. */
	/* Reached the end of the list, so insert after 'frag_entry_last'. */
	if (likely(frag_entry_curr)) {
	if (likely(frag_entry_last)) {
		hlist_add_after(&frag_entry_curr->list, &frag_entry_new->list);
		hlist_add_after(&frag_entry_last->list, &frag_entry_new->list);
		chain->size += skb->len - hdr_size;
		chain->size += skb->len - hdr_size;
		chain->timestamp = jiffies;
		chain->timestamp = jiffies;
		ret = true;
		ret = true;