From: Jarek Poplawski <jarkao2@gmail.com>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: David Miller <davem@davemloft.net>, netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH net-next-2.6] sfq: fix sfq stats handling
Date: Wed, 22 Dec 2010 07:32:11 +0000 [thread overview]
Message-ID: <20101222073211.GA7001@ff.dom.local> (raw)
In-Reply-To: <1292998499.4317.13.camel@edumazet-laptop>
On Wed, Dec 22, 2010 at 07:14:59AM +0100, Eric Dumazet wrote:
> David, since this one fixes a bug, could you apply it before the pending
> SFQ patch (sch_sfq: allow big packets and be fair), I'll respin this one
> if necessary.
>
> Thanks
>
> [PATCH net-next-2.6] sfq: fix sfq class stats handling
>
> sfq_walk() runs without qdisc lock. By the time it selects a non empty
> hash slot and sfq_dump_class_stats() is run (with lock held), slot might
> have been freed : We then access q->slots[SFQ_EMPTY_SLOT], out of
> bounds, and crash in slot_queue_walk()
>
> On previous kernels, bug is here but out of bounds qs[SFQ_DEPTH] and
> allot[SFQ_DEPTH] are located in struct sfq_sched_data, so no illegal
> memory access happens, only possibly wrong data reported to user.
Yes, nice catch!
> Also, slot_dequeue_tail() should make sure slot skb chain is correctly
> terminated, or sfq_dump_class_stats() can access freed skbs.
...and a good hint for code reusing ;-)
Thanks,
Jarek P.
>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> Cc: Jarek Poplawski <jarkao2@gmail.com>
> ---
> net/sched/sch_sfq.c | 16 +++++++++++-----
> 1 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
> index 13322e8..6a2f88f 100644
> --- a/net/sched/sch_sfq.c
> +++ b/net/sched/sch_sfq.c
> @@ -281,6 +281,7 @@ static inline struct sk_buff *slot_dequeue_tail(struct sfq_slot *slot)
> struct sk_buff *skb = slot->skblist_prev;
>
> slot->skblist_prev = skb->prev;
> + skb->prev->next = (struct sk_buff *)slot;
> skb->next = skb->prev = NULL;
> return skb;
> }
> @@ -608,14 +609,19 @@ static int sfq_dump_class_stats(struct Qdisc *sch, unsigned long cl,
> struct gnet_dump *d)
> {
> struct sfq_sched_data *q = qdisc_priv(sch);
> - const struct sfq_slot *slot = &q->slots[q->ht[cl - 1]];
> - struct gnet_stats_queue qs = { .qlen = slot->qlen };
> - struct tc_sfq_xstats xstats = { .allot = slot->allot };
> + sfq_index idx = q->ht[cl - 1];
> + struct gnet_stats_queue qs = { 0 };
> + struct tc_sfq_xstats xstats = { 0 };
> struct sk_buff *skb;
>
> - slot_queue_walk(slot, skb)
> - qs.backlog += qdisc_pkt_len(skb);
> + if (idx != SFQ_EMPTY_SLOT) {
> + const struct sfq_slot *slot = &q->slots[idx];
>
> + xstats.allot = slot->allot;
> + qs.qlen = slot->qlen;
> + slot_queue_walk(slot, skb)
> + qs.backlog += qdisc_pkt_len(skb);
> + }
> if (gnet_stats_copy_queue(d, &qs) < 0)
> return -1;
> return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
>
>
next prev parent reply other threads:[~2010-12-22 7:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-22 6:14 [PATCH net-next-2.6] sfq: fix sfq stats handling Eric Dumazet
2010-12-22 7:32 ` Jarek Poplawski [this message]
2010-12-30 15:02 ` [PATCH net-next-2.6] sfq: fix slot_dequeue_head() Eric Dumazet
2010-12-30 17:49 ` Jarek Poplawski
2010-12-30 21:31 ` Eric Dumazet
2010-12-31 20:49 ` David Miller
2010-12-22 19:39 ` [PATCH net-next-2.6] sfq: fix sfq stats handling David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101222073211.GA7001@ff.dom.local \
--to=jarkao2@gmail.com \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.