All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <shemminger@vyatta.com>
To: Denis Efremov <yefremov.denis@gmail.com>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>,
	Patrick McHardy <kaber@trash.net>,
	netfilter-devel@vger.kernel.org, netfilter@vger.kernel.org,
	coreteam@netfilter.org, linux-kernel@vger.kernel.org,
	ldv-project@ispras.ru
Subject: Re: [PATCH] [NETFILTER] bridge: rcu_deref outside read-lock section
Date: Mon, 13 Aug 2012 16:36:41 -0700	[thread overview]
Message-ID: <20120813163641.69a8388a@nehalam.linuxnetplumber.net> (raw)
In-Reply-To: <1344898062-23633-1-git-send-email-yefremov.denis@gmail.com>

On Tue, 14 Aug 2012 02:47:42 +0400
Denis Efremov <yefremov.denis@gmail.com> wrote:

> As it noted in the comment before the br_handle_frame_finish
> function, this function should be called under rcu_read_lock.
> 
> The problem callgraph:
> br_dev_xmit -> br_nf_pre_routing_finish_bridge_slow ->
> -> br_handle_frame_finish -> br_port_get_rcu -> rcu_dereference
> 
> And in this case there is no read-lock section.
> I have put lock/unlock in br_nf_pre_routing_finish_bridge_slow,
> as the only function that calls it(for now) - is br_dev_xmit.
> 
> Found by Linux Driver Verification project (linuxtesting.org).
> 
> Signed-off-by: Denis Efremov <yefremov.denis@gmail.com>
> ---
>  include/linux/netfilter_bridge.h |    6 +++++-
>  1 files changed, 5 insertions(+), 1 deletions(-)
> 
> diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h
> index 31d2844..ceb048e 100644
> --- a/include/linux/netfilter_bridge.h
> +++ b/include/linux/netfilter_bridge.h
> @@ -79,6 +79,7 @@ extern int br_handle_frame_finish(struct sk_buff *skb);
>  /* Only used in br_device.c */
>  static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
>  {
> +	int res;
>  	struct nf_bridge_info *nf_bridge = skb->nf_bridge;
>  
>  	skb_pull(skb, ETH_HLEN);
> @@ -86,7 +87,10 @@ static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
>  	skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
>  				       skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
>  	skb->dev = nf_bridge->physindev;
> -	return br_handle_frame_finish(skb);
> +	rcu_read_lock();
> +	res = br_handle_frame_finish(skb);
> +	rcu_read_unlock();
> +	return res;
>  }
>  
>  /* This is called by the IP fragmenting code and it ensures there is

Why not just move the rcu_read_lock() in br_dev_xmit earlier?

  reply	other threads:[~2012-08-13 23:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-13 22:47 [PATCH] bridge: rcu_deref outside read-lock section Denis Efremov
2012-08-13 22:47 ` [PATCH] [NETFILTER] " Denis Efremov
2012-08-13 23:36 ` Stephen Hemminger [this message]
2012-08-14  7:32   ` Denis
2012-08-14  8:08 ` [PATCH v2] " Denis Efremov
2012-08-14 15:19   ` [PATCH] bridge: fix rcu dereference outside of rcu_read_lock Stephen Hemminger
2012-08-15 22:10     ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120813163641.69a8388a@nehalam.linuxnetplumber.net \
    --to=shemminger@vyatta.com \
    --cc=coreteam@netfilter.org \
    --cc=kaber@trash.net \
    --cc=ldv-project@ispras.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=netfilter@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=yefremov.denis@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.