mbox series

[net-next,0/5] net/sched: improve class lifetime handling

Message ID 20230721191332.1424997-1-pctammela@mojatatu.com (mailing list archive)
Headers show
Series net/sched: improve class lifetime handling | expand

Message

Pedro Tammela July 21, 2023, 7:13 p.m. UTC
Valis says[0]:
============
Three classifiers (cls_fw, cls_u32 and cls_route) always copy
tcf_result struct into the new instance of the filter on update.

This causes a problem when updating a filter bound to a class,
as tcf_unbind_filter() is always called on the old instance in the
success path, decreasing filter_cnt of the still referenced class
and allowing it to be deleted, leading to a use-after-free.
============

Turns out these could have been spotted easily with proper warnings.
Improve the current class lifetime with wrappers that check for
overflow/underflow.

While at it add an extack for when a class in use is deleted.

[0] https://lore.kernel.org/all/20230721174856.3045-1-sec@valis.email/


Pedro Tammela (5):
  net/sched: wrap open coded Qdics class filter counter
  net/sched: sch_drr: warn about class in use while deleting
  net/sched: sch_hfsc: warn about class in use while deleting
  net/sched: sch_htb: warn about class in use while deleting
  net/sched: sch_qfq: warn about class in use while deleting

 include/net/sch_generic.h |  1 +
 include/net/tc_class.h    | 33 +++++++++++++++++++++++++++++++++
 net/sched/sch_drr.c       | 12 +++++++-----
 net/sched/sch_hfsc.c      | 11 +++++++----
 net/sched/sch_htb.c       | 11 ++++++-----
 net/sched/sch_qfq.c       | 11 ++++++-----
 6 files changed, 60 insertions(+), 19 deletions(-)
 create mode 100644 include/net/tc_class.h

Comments

Jamal Hadi Salim July 22, 2023, 12:41 p.m. UTC | #1
On Fri, Jul 21, 2023 at 3:14 PM Pedro Tammela <pctammela@mojatatu.com> wrote:
>
> Valis says[0]:
> ============
> Three classifiers (cls_fw, cls_u32 and cls_route) always copy
> tcf_result struct into the new instance of the filter on update.
>
> This causes a problem when updating a filter bound to a class,
> as tcf_unbind_filter() is always called on the old instance in the
> success path, decreasing filter_cnt of the still referenced class
> and allowing it to be deleted, leading to a use-after-free.
> ============
>
> Turns out these could have been spotted easily with proper warnings.
> Improve the current class lifetime with wrappers that check for
> overflow/underflow.
>
> While at it add an extack for when a class in use is deleted.
>
> [0] https://lore.kernel.org/all/20230721174856.3045-1-sec@valis.email/
>

For the series:
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>

cheers,
jamal
>
> Pedro Tammela (5):
>   net/sched: wrap open coded Qdics class filter counter
>   net/sched: sch_drr: warn about class in use while deleting
>   net/sched: sch_hfsc: warn about class in use while deleting
>   net/sched: sch_htb: warn about class in use while deleting
>   net/sched: sch_qfq: warn about class in use while deleting
>
>  include/net/sch_generic.h |  1 +
>  include/net/tc_class.h    | 33 +++++++++++++++++++++++++++++++++
>  net/sched/sch_drr.c       | 12 +++++++-----
>  net/sched/sch_hfsc.c      | 11 +++++++----
>  net/sched/sch_htb.c       | 11 ++++++-----
>  net/sched/sch_qfq.c       | 11 ++++++-----
>  6 files changed, 60 insertions(+), 19 deletions(-)
>  create mode 100644 include/net/tc_class.h
>
> --
> 2.39.2
>