Skip to content

Commit 0b9dcf3

Browse files
committed
Merge branch 'net-sched-two-fixes-for-cls_u32'
Eric Dumazet says: ==================== net/sched: two fixes for cls_u32 One syzbot report brought my attention to cls_u32. This series addresses the syzbot report, and an additional issue discovered in code review. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents f3226ee + ec5b0f6 commit 0b9dcf3

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

net/sched/cls_u32.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -386,14 +386,19 @@ static int u32_init(struct tcf_proto *tp)
386386
return 0;
387387
}
388388

389-
static int u32_destroy_key(struct tc_u_knode *n, bool free_pf)
389+
static void __u32_destroy_key(struct tc_u_knode *n)
390390
{
391391
struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
392392

393393
tcf_exts_destroy(&n->exts);
394-
tcf_exts_put_net(&n->exts);
395394
if (ht && --ht->refcnt == 0)
396395
kfree(ht);
396+
kfree(n);
397+
}
398+
399+
static void u32_destroy_key(struct tc_u_knode *n, bool free_pf)
400+
{
401+
tcf_exts_put_net(&n->exts);
397402
#ifdef CONFIG_CLS_U32_PERF
398403
if (free_pf)
399404
free_percpu(n->pf);
@@ -402,8 +407,7 @@ static int u32_destroy_key(struct tc_u_knode *n, bool free_pf)
402407
if (free_pf)
403408
free_percpu(n->pcpu_success);
404409
#endif
405-
kfree(n);
406-
return 0;
410+
__u32_destroy_key(n);
407411
}
408412

409413
/* u32_delete_key_rcu should be called when free'ing a copied
@@ -811,10 +815,6 @@ static struct tc_u_knode *u32_init_knode(struct net *net, struct tcf_proto *tp,
811815
new->flags = n->flags;
812816
RCU_INIT_POINTER(new->ht_down, ht);
813817

814-
/* bump reference count as long as we hold pointer to structure */
815-
if (ht)
816-
ht->refcnt++;
817-
818818
#ifdef CONFIG_CLS_U32_PERF
819819
/* Statistics may be incremented by readers during update
820820
* so we must keep them in tact. When the node is later destroyed
@@ -836,6 +836,10 @@ static struct tc_u_knode *u32_init_knode(struct net *net, struct tcf_proto *tp,
836836
return NULL;
837837
}
838838

839+
/* bump reference count as long as we hold pointer to structure */
840+
if (ht)
841+
ht->refcnt++;
842+
839843
return new;
840844
}
841845

@@ -900,13 +904,13 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
900904
extack);
901905

902906
if (err) {
903-
u32_destroy_key(new, false);
907+
__u32_destroy_key(new);
904908
return err;
905909
}
906910

907911
err = u32_replace_hw_knode(tp, new, flags, extack);
908912
if (err) {
909-
u32_destroy_key(new, false);
913+
__u32_destroy_key(new);
910914
return err;
911915
}
912916

0 commit comments

Comments
 (0)