lkml.org 
[lkml]   [2020]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 4.19 03/54] sctp: fix refcount bug in sctp_wfree
    Hi!

    > The following case cause the bug:
    > for the trouble SKB, it was in outq->transmitted list

    Ok... but this is one hell of "interesting" code.

    > --- a/net/sctp/socket.c
    > +++ b/net/sctp/socket.c
    > @@ -165,29 +165,44 @@ static void sctp_clear_owner_w(struct sc
    > skb_orphan(chunk->skb);
    > }
    >
    > +#define traverse_and_process() \
    > +do { \
    > + msg = chunk->msg; \
    > + if (msg == prev_msg) \
    > + continue; \
    > + list_for_each_entry(c, &msg->chunks, frag_list) { \
    > + if ((clear && asoc->base.sk == c->skb->sk) || \
    > + (!clear && asoc->base.sk != c->skb->sk)) \
    > + cb(c); \
    > + } \
    > + prev_msg = msg; \
    > +} while (0)

    Should this be function?

    Do you see how it does "continue"? But the do {} while(0) wrapper eats
    the continue. "break" would be more clear here, but they are really
    equivalent due to way this macro is used.

    It is just very, very confusing.

    Best regards,
    Pavel


    --
    (english) http://www.livejournal.com/~pavelmachek
    (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2020-04-11 20:28    [W:6.391 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site