aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ip6_flowlabel.c
diff options
context:
space:
mode:
authorFlorent Fourcot <florent.fourcot@enst-bretagne.fr>2013-11-07 11:53:14 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-08 13:44:15 -0500
commit394055f6fabd077e74815865f01a73a31dd765d3 (patch)
treef662d2d1206ef88cc47e97ac01d2f6f3dc6b8a67 /net/ipv6/ip6_flowlabel.c
parent53b47106c0c2b1f42237d255ae272f0fcc3ec413 (diff)
ipv6: protect flow label renew against GC
Take ip6_fl_lock before to read and update a label. v2: protect only the relevant code Reported-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: Florent Fourcot <florent.fourcot@enst-bretagne.fr> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ip6_flowlabel.c')
-rw-r--r--net/ipv6/ip6_flowlabel.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index 5f10b0d0bca5..98fdcc6f51b1 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -345,6 +345,8 @@ static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo
345 expires = check_linger(expires); 345 expires = check_linger(expires);
346 if (!expires) 346 if (!expires)
347 return -EPERM; 347 return -EPERM;
348
349 spin_lock_bh(&ip6_fl_lock);
348 fl->lastuse = jiffies; 350 fl->lastuse = jiffies;
349 if (time_before(fl->linger, linger)) 351 if (time_before(fl->linger, linger))
350 fl->linger = linger; 352 fl->linger = linger;
@@ -352,6 +354,8 @@ static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo
352 expires = fl->linger; 354 expires = fl->linger;
353 if (time_before(fl->expires, fl->lastuse + expires)) 355 if (time_before(fl->expires, fl->lastuse + expires))
354 fl->expires = fl->lastuse + expires; 356 fl->expires = fl->lastuse + expires;
357 spin_unlock_bh(&ip6_fl_lock);
358
355 return 0; 359 return 0;
356} 360}
357 361