Message ID | 20220624081254.1251316-1-zys.zljxml@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ipv6/sit: fix ipip6_tunnel_get_prl when memory allocation fails | expand |
On 6/24/22 2:12 AM, zys.zljxml@gmail.com wrote: > diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c > index c0b138c20992..4fb84c0b30be 100644 > --- a/net/ipv6/sit.c > +++ b/net/ipv6/sit.c > @@ -323,8 +323,6 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > kcalloc(cmax, sizeof(*kp), GFP_KERNEL_ACCOUNT | __GFP_NOWARN) : > NULL; > > - rcu_read_lock(); > - > ca = min(t->prl_count, cmax); > > if (!kp) { > @@ -337,11 +335,12 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > __GFP_NOWARN); > if (!kp) { > ret = -ENOMEM; > - goto out; > + goto err; > } > } > > c = 0; > + rcu_read_lock(); > for_each_prl_rcu(t->prl) { > if (c >= cmax) > break; > @@ -362,7 +361,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > ret = -EFAULT; > > kfree(kp); > - > +err: > return ret; > } > 'out' label is no longer used and should be removed.
On Fri, Jun 24, 2022 at 11:12 PM David Ahern <dsahern@kernel.org> wrote: > > On 6/24/22 2:12 AM, zys.zljxml@gmail.com wrote: > > diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c > > index c0b138c20992..4fb84c0b30be 100644 > > --- a/net/ipv6/sit.c > > +++ b/net/ipv6/sit.c > > @@ -323,8 +323,6 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > > kcalloc(cmax, sizeof(*kp), GFP_KERNEL_ACCOUNT | __GFP_NOWARN) : > > NULL; > > > > - rcu_read_lock(); > > - > > ca = min(t->prl_count, cmax); > > > > if (!kp) { > > @@ -337,11 +335,12 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > > __GFP_NOWARN); > > if (!kp) { > > ret = -ENOMEM; > > - goto out; > > + goto err; > > } > > } > > > > c = 0; > > + rcu_read_lock(); > > for_each_prl_rcu(t->prl) { > > if (c >= cmax) > > break; > > @@ -362,7 +361,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u > > ret = -EFAULT; > > > > kfree(kp); > > - > > +err: > > return ret; > > } > > > > 'out' label is no longer used and should be removed. Thanks for reviewing! I sent the V2 patch, modified according to your suggestion. The label is removed, and I still use the label "out" instead of "err". Best Regards, Katrin
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index c0b138c20992..4fb84c0b30be 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -323,8 +323,6 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u kcalloc(cmax, sizeof(*kp), GFP_KERNEL_ACCOUNT | __GFP_NOWARN) : NULL; - rcu_read_lock(); - ca = min(t->prl_count, cmax); if (!kp) { @@ -337,11 +335,12 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u __GFP_NOWARN); if (!kp) { ret = -ENOMEM; - goto out; + goto err; } } c = 0; + rcu_read_lock(); for_each_prl_rcu(t->prl) { if (c >= cmax) break; @@ -362,7 +361,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ip_tunnel_prl __u ret = -EFAULT; kfree(kp); - +err: return ret; }