Explorar o código

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>
Florent Fourcot %!s(int64=11) %!d(string=hai) anos
pai
achega
394055f6fa
Modificáronse 1 ficheiros con 4 adicións e 0 borrados
  1. 4 0
      net/ipv6/ip6_flowlabel.c

+ 4 - 0
net/ipv6/ip6_flowlabel.c

@@ -345,6 +345,8 @@ static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo
 	expires = check_linger(expires);
 	expires = check_linger(expires);
 	if (!expires)
 	if (!expires)
 		return -EPERM;
 		return -EPERM;
+
+	spin_lock_bh(&ip6_fl_lock);
 	fl->lastuse = jiffies;
 	fl->lastuse = jiffies;
 	if (time_before(fl->linger, linger))
 	if (time_before(fl->linger, linger))
 		fl->linger = linger;
 		fl->linger = linger;
@@ -352,6 +354,8 @@ static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo
 		expires = fl->linger;
 		expires = fl->linger;
 	if (time_before(fl->expires, fl->lastuse + expires))
 	if (time_before(fl->expires, fl->lastuse + expires))
 		fl->expires = fl->lastuse + expires;
 		fl->expires = fl->lastuse + expires;
+	spin_unlock_bh(&ip6_fl_lock);
+
 	return 0;
 	return 0;
 }
 }