• Davide Caratti's avatar
    net/sched: cls_matchall: fix crash when used with classful qdisc · 3ff4cbec
    Davide Caratti authored
    this script, edited from Linux Advanced Routing and Traffic Control guide
    
    tc q a dev en0 root handle 1: htb default a
    tc c a dev en0 parent 1:  classid 1:1 htb rate 6mbit burst 15k
    tc c a dev en0 parent 1:1 classid 1:a htb rate 5mbit ceil 6mbit burst 15k
    tc c a dev en0 parent 1:1 classid 1:b htb rate 1mbit ceil 6mbit burst 15k
    tc f a dev en0 parent 1:0 prio 1 $clsname $clsargs classid 1:b
    ping $address -c1
    tc -s c s dev en0
    
    classifies traffic to 1:b or 1:a, depending on whether the packet matches
    or not the pattern $clsargs of filter $clsname. However, when $clsname is
    'matchall', a systematic crash can be observed in htb_classify(). HTB and
    classful qdiscs don't assign initial value to struct tcf_result, but then
    they expect it to contain valid values after filters have been run. Thus,
    current 'matchall' ignores the TCA_MATCHALL_CLASSID attribute, configured
    by user, and makes HTB (and classful qdiscs) dereference random pointers.
    
    By assigning head->res to *res in mall_classify(), before the actions are
    invoked, we fix this crash and enable TCA_MATCHALL_CLASSID functionality,
    that had no effect on 'matchall' classifier since its first introduction.
    
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1460213Reported-by: default avatarJiri Benc <jbenc@redhat.com>
    Fixes: b87f7936 ("net/sched: introduce Match-all classifier")
    Signed-off-by: default avatarDavide Caratti <dcaratti@redhat.com>
    Acked-by: default avatarYotam Gigi <yotamg@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3ff4cbec
cls_matchall.c 6.41 KB