Message ID | 1335726502.3897.8.camel@edumazet-glaptop |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Sun, 29 Apr 2012 21:08:22 +0200 Eric Dumazet <eric.dumazet@gmail.com> wrote: > From: Eric Dumazet <edumazet@google.com> > > skb_checksum_help(skb) can return an error, we must free skb in this > case. qdisc_drop(skb, sch) can also be feeded with a NULL skb (if > skb_unshare() failed), so lets use this generic helper. > > Signed-off-by: Eric Dumazet <edumazet@google.com> > Cc: Stephen Hemminger <shemminger@osdl.org> > --- > net/sched/sch_netem.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c > index 5da548f..ebd2296 100644 > --- a/net/sched/sch_netem.c > +++ b/net/sched/sch_netem.c > @@ -408,10 +408,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) > if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { > if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || > (skb->ip_summed == CHECKSUM_PARTIAL && > - skb_checksum_help(skb))) { > - sch->qstats.drops++; > - return NET_XMIT_DROP; > - } > + skb_checksum_help(skb))) > + return qdisc_drop(skb, sch); > > skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); > } > > This would crater if skb_unshare() returned NULL. I think the conditional needs to be split into two paths. -- 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
On Mon, 2012-04-30 at 09:25 -0700, Stephen Hemminger wrote: > On Sun, 29 Apr 2012 21:08:22 +0200 > Eric Dumazet <eric.dumazet@gmail.com> wrote: > > > From: Eric Dumazet <edumazet@google.com> > > > > skb_checksum_help(skb) can return an error, we must free skb in this > > case. qdisc_drop(skb, sch) can also be feeded with a NULL skb (if > > skb_unshare() failed), so lets use this generic helper. > > > > Signed-off-by: Eric Dumazet <edumazet@google.com> > > Cc: Stephen Hemminger <shemminger@osdl.org> > > --- > > net/sched/sch_netem.c | 6 ++---- > > 1 file changed, 2 insertions(+), 4 deletions(-) > > > > diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c > > index 5da548f..ebd2296 100644 > > --- a/net/sched/sch_netem.c > > +++ b/net/sched/sch_netem.c > > @@ -408,10 +408,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) > > if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { > > if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || > > (skb->ip_summed == CHECKSUM_PARTIAL && > > - skb_checksum_help(skb))) { > > - sch->qstats.drops++; > > - return NET_XMIT_DROP; > > - } > > + skb_checksum_help(skb))) > > + return qdisc_drop(skb, sch); > > > > skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); > > } > > > > > > This would crater if skb_unshare() returned NULL. I think the conditional > needs to be split into two paths. Maybe you can read the changelog where I explained this was safe ;) -- 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
On Mon, 30 Apr 2012 18:40:16 +0200 Eric Dumazet <eric.dumazet@gmail.com> wrote: > On Mon, 2012-04-30 at 09:25 -0700, Stephen Hemminger wrote: > > On Sun, 29 Apr 2012 21:08:22 +0200 > > Eric Dumazet <eric.dumazet@gmail.com> wrote: > > > > > From: Eric Dumazet <edumazet@google.com> > > > > > > skb_checksum_help(skb) can return an error, we must free skb in this > > > case. qdisc_drop(skb, sch) can also be feeded with a NULL skb (if > > > skb_unshare() failed), so lets use this generic helper. > > > > > > Signed-off-by: Eric Dumazet <edumazet@google.com> > > > Cc: Stephen Hemminger <shemminger@osdl.org> > > > --- > > > net/sched/sch_netem.c | 6 ++---- > > > 1 file changed, 2 insertions(+), 4 deletions(-) > > > > > > diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c > > > index 5da548f..ebd2296 100644 > > > --- a/net/sched/sch_netem.c > > > +++ b/net/sched/sch_netem.c > > > @@ -408,10 +408,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) > > > if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { > > > if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || > > > (skb->ip_summed == CHECKSUM_PARTIAL && > > > - skb_checksum_help(skb))) { > > > - sch->qstats.drops++; > > > - return NET_XMIT_DROP; > > > - } > > > + skb_checksum_help(skb))) > > > + return qdisc_drop(skb, sch); > > > > > > skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); > > > } > > > > > > > > > > This would crater if skb_unshare() returned NULL. I think the conditional > > needs to be split into two paths. > > Maybe you can read the changelog where I explained this was safe ;) Ok, I am surprised that qdisc_drop() is safe with NULL skb, but yes. -- 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
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Sun, 29 Apr 2012 21:08:22 +0200 > From: Eric Dumazet <edumazet@google.com> > > skb_checksum_help(skb) can return an error, we must free skb in this > case. qdisc_drop(skb, sch) can also be feeded with a NULL skb (if > skb_unshare() failed), so lets use this generic helper. > > Signed-off-by: Eric Dumazet <edumazet@google.com> Applied and queued up for -stable, 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/sched/sch_netem.c b/net/sched/sch_netem.c index 5da548f..ebd2296 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -408,10 +408,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || (skb->ip_summed == CHECKSUM_PARTIAL && - skb_checksum_help(skb))) { - sch->qstats.drops++; - return NET_XMIT_DROP; - } + skb_checksum_help(skb))) + return qdisc_drop(skb, sch); skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); }