From patchwork Tue Nov 5 14:28:58 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florent Fourcot X-Patchwork-Id: 288546 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3112D2C0141 for ; Wed, 6 Nov 2013 01:29:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755311Ab3KEO3R (ORCPT ); Tue, 5 Nov 2013 09:29:17 -0500 Received: from fourcot.fr ([217.70.191.14]:40713 "EHLO olfflo.fourcot.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755157Ab3KEO3P (ORCPT ); Tue, 5 Nov 2013 09:29:15 -0500 Received: from reglisse.fourcot.fr (dud31.inf.tu-dresden.de [141.76.46.31]) (Authenticated sender: reglisse) by olfflo.fourcot.fr (Postfix) with ESMTPSA id A6DDF2E43C; Tue, 5 Nov 2013 15:29:14 +0100 (CET) Received: by reglisse.fourcot.fr (Postfix, from userid 1000) id 6B7AE7558BF; Tue, 5 Nov 2013 15:29:14 +0100 (CET) From: Florent Fourcot To: netdev@vger.kernel.org Cc: Florent Fourcot Subject: [PATCH net-next 4/4] ipv6: protect flow label renew against GC Date: Tue, 5 Nov 2013 15:28:58 +0100 Message-Id: <1383661738-6083-4-git-send-email-florent.fourcot@enst-bretagne.fr> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1383661738-6083-1-git-send-email-florent.fourcot@enst-bretagne.fr> References: <1383661738-6083-1-git-send-email-florent.fourcot@enst-bretagne.fr> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Take ip6_fl_lock before to read and update a label. It prevents race condition if GC is running. Reported-by: Hannes Frederic Sowa Signed-off-by: Florent Fourcot --- net/ipv6/ip6_flowlabel.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index 41ced9c..1d2fc48 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c @@ -540,11 +540,13 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen) return -ESRCH; case IPV6_FL_A_RENEW: + spin_lock_bh(&ip6_fl_lock); rcu_read_lock_bh(); for_each_sk_fl_rcu(np, sfl) { if (sfl->fl->label == freq.flr_label) { err = fl6_renew(sfl->fl, freq.flr_linger, freq.flr_expires); rcu_read_unlock_bh(); + spin_unlock_bh(&ip6_fl_lock); return err; } } @@ -555,10 +557,12 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen) fl = fl_lookup(net, freq.flr_label); if (fl) { err = fl6_renew(fl, freq.flr_linger, freq.flr_expires); + spin_unlock_bh(&ip6_fl_lock); fl_release(fl); return err; } } + spin_unlock_bh(&ip6_fl_lock); return -ESRCH; case IPV6_FL_A_GET: