Message ID | 20110428.132032.115947683.davem@davemloft.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Le jeudi 28 avril 2011 à 13:20 -0700, David Miller a écrit : > From: Eric Dumazet <eric.dumazet@gmail.com> > Date: Thu, 21 Apr 2011 21:45:37 +0200 > > > [PATCH] inet: add RCU protection to inet->opt > > Applied, although I had to add the following build fix to the > final commit: > > diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c > index cc67367..962a607 100644 > --- a/net/l2tp/l2tp_ip.c > +++ b/net/l2tp/l2tp_ip.c > @@ -416,7 +416,6 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m > int rc; > struct l2tp_ip_sock *lsa = l2tp_ip_sk(sk); > struct inet_sock *inet = inet_sk(sk); > - struct ip_options *opt = inet->opt; > struct rtable *rt = NULL; > int connected = 0; > __be32 daddr; > @@ -471,9 +470,14 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m > rt = (struct rtable *) __sk_dst_check(sk, 0); > > if (rt == NULL) { > + struct ip_options_rcu *inet_opt; > + > + inet_opt = rcu_dereference_protected(inet->inet_opt, > + sock_owned_by_user(sk)); > + > /* Use correct destination address if we have options. */ > - if (opt && opt->srr) > - daddr = opt->faddr; > + if (inet_opt && inet_opt->opt.srr) > + daddr = inet_opt->opt.faddr; > > /* If this fails, retransmit mechanism of transport layer will > * keep trying until route appears or the connection times Gah... I wonder how I missed it. Are you sure socket is locked at this point ? ( by a priori call to lock_sock()) Thanks ! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index cc67367..962a607 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c @@ -416,7 +416,6 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m int rc; struct l2tp_ip_sock *lsa = l2tp_ip_sk(sk); struct inet_sock *inet = inet_sk(sk); - struct ip_options *opt = inet->opt; struct rtable *rt = NULL; int connected = 0; __be32 daddr; @@ -471,9 +470,14 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m rt = (struct rtable *) __sk_dst_check(sk, 0); if (rt == NULL) { + struct ip_options_rcu *inet_opt; + + inet_opt = rcu_dereference_protected(inet->inet_opt, + sock_owned_by_user(sk)); + /* Use correct destination address if we have options. */ - if (opt && opt->srr) - daddr = opt->faddr; + if (inet_opt && inet_opt->opt.srr) + daddr = inet_opt->opt.faddr; /* If this fails, retransmit mechanism of transport layer will * keep trying until route appears or the connection times