batman-adv: increase orig refcount when storing ref in gw_node
PATCH v2 1/1 batman-adv: increase orig refcount when storing ref in gw_node
From: Antonio Quartulli <[email protected]>
A pointer to the orig_node representing a bat-gateway is stored in the gw_node->orig_node member, but the refcount for such orig_node is never increased.
This leads to memory faults when gw_node->orig_node is accessed and the originator has already been freed.
Fix this by increasing the refcount on gw_node creation and decreasing it on gw_node free.
---
Change since v1:
- properly release orig_node in case of gw_node allocation failure
gateway_client.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
gateway_client.c +9 -2
@@ -42,8 +42,10 @@static void batadv_gw_node_free_ref (struct batadv_gw_node *gw_node) { -if (atomic_dec_and_test (&gw_node->refcount)) +if (atomic_dec_and_test (&gw_node->refcount)) { +batadv_orig_node_free_ref (gw_node->orig_node);kfree_rcu (gw_node, rcu); + } } static struct batadv_gw_node *
@@ -406,9 +408,14 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv,if (gateway->bandwidth_down ==0 )return ; +if (!atomic_inc_not_zero (&orig_node->refcount)) +return ; + gw_node =kzalloc (sizeof (*gw_node),GFP_ATOMIC ); -if (!gw_node) +if (!gw_node) { +batadv_orig_node_free_ref (orig_node);return ; + }INIT_HLIST_NODE (&gw_node->list); gw_node->orig_node = orig_node;
Signature · 1 line
1.8.3.2
Marek Lindner
AppliedQuoted 11 lines · On Friday 02 May 2014 01:35:13 Antonio Quartulli wrote:
From: Antonio Quartulli <[email protected]>
A pointer to the
orig_noderepresenting a bat-gateway is stored in thegw_node->orig_nodemember, but the refcount for suchorig_nodeis never increased.
This leads to memory faults whengw_node->orig_nodeis accessed and the originator has already been freed.Fix this by increasing the refcount on
gw_nodecreation and decreasing it ongw_nodefree.
Quoted 8 lines
Signed-off-by Antonio Quartulli <[email protected]>---
Change since v1:
- properly releaseorig_nodein case ofgw_nodeallocation failuregateway_client.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
Applied in revision 8dbdee5.
Thanks,
Marek