Commit e78783da authored by Sven Eckelmann's avatar Sven Eckelmann Committed by Simon Wunderlich
Browse files

batman-adv: Check ptr for NULL before reducing its refcnt



The commit b37a4668 ("netdevice: add the case if dev is NULL") changed
the way how the NULL check for net_devices have to be handled when trying
to reduce its reference counter. Before this commit, it was the
responsibility of the caller to check whether the object is NULL or not.
But it was changed to behave more like kfree. Now the callee has to handle
the NULL-case.

The batman-adv code was scanned via cocinelle for similar places. These
were changed to use the paradigm

  @@
  identifier E, T, R, C;
  identifier put;
  @@
   void put(struct T *E)
   {
  +	if (!E)
  +		return;
  	kref_put(&E->C, R);
   }

Functions which were used in other sources files were moved to the header
to allow the compiler to inline the NULL check and the kref_put call.

Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
parent 55207227
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -162,6 +162,9 @@ static void batadv_backbone_gw_release(struct kref *ref)
 */
static void batadv_backbone_gw_put(struct batadv_bla_backbone_gw *backbone_gw)
{
	if (!backbone_gw)
		return;

	kref_put(&backbone_gw->refcount, batadv_backbone_gw_release);
}

@@ -197,6 +200,9 @@ static void batadv_claim_release(struct kref *ref)
 */
static void batadv_claim_put(struct batadv_bla_claim *claim)
{
	if (!claim)
		return;

	kref_put(&claim->refcount, batadv_claim_release);
}

+3 −0
Original line number Diff line number Diff line
@@ -127,6 +127,9 @@ static void batadv_dat_entry_release(struct kref *ref)
 */
static void batadv_dat_entry_put(struct batadv_dat_entry *dat_entry)
{
	if (!dat_entry)
		return;

	kref_put(&dat_entry->refcount, batadv_dat_entry_release);
}

+1 −11
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@
 *  after rcu grace period
 * @ref: kref pointer of the gw_node
 */
static void batadv_gw_node_release(struct kref *ref)
void batadv_gw_node_release(struct kref *ref)
{
	struct batadv_gw_node *gw_node;

@@ -69,16 +69,6 @@ static void batadv_gw_node_release(struct kref *ref)
	kfree_rcu(gw_node, rcu);
}

/**
 * batadv_gw_node_put() - decrement the gw_node refcounter and possibly release
 *  it
 * @gw_node: gateway node to free
 */
void batadv_gw_node_put(struct batadv_gw_node *gw_node)
{
	kref_put(&gw_node->refcount, batadv_gw_node_release);
}

/**
 * batadv_gw_get_selected_gw_node() - Get currently selected gateway
 * @bat_priv: the bat priv with all the soft interface information
+15 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

#include "main.h"

#include <linux/kref.h>
#include <linux/netlink.h>
#include <linux/skbuff.h>
#include <linux/types.h>
@@ -27,7 +28,7 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv,
void batadv_gw_node_delete(struct batadv_priv *bat_priv,
			   struct batadv_orig_node *orig_node);
void batadv_gw_node_free(struct batadv_priv *bat_priv);
void batadv_gw_node_put(struct batadv_gw_node *gw_node);
void batadv_gw_node_release(struct kref *ref);
struct batadv_gw_node *
batadv_gw_get_selected_gw_node(struct batadv_priv *bat_priv);
int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb);
@@ -38,4 +39,17 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
struct batadv_gw_node *batadv_gw_node_get(struct batadv_priv *bat_priv,
					  struct batadv_orig_node *orig_node);

/**
 * batadv_gw_node_put() - decrement the gw_node refcounter and possibly release
 *  it
 * @gw_node: gateway node to free
 */
static inline void batadv_gw_node_put(struct batadv_gw_node *gw_node)
{
	if (!gw_node)
		return;

	kref_put(&gw_node->refcount, batadv_gw_node_release);
}

#endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */
+3 −0
Original line number Diff line number Diff line
@@ -89,6 +89,9 @@ int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
 */
static inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface)
{
	if (!hard_iface)
		return;

	kref_put(&hard_iface->refcount, batadv_hardif_release);
}

Loading