lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 28 Nov 2018 12:28:22 +0300
From:   Dan Carpenter <dan.carpenter@...cle.com>
To:     kbuild@...org, Davide Caratti <dcaratti@...hat.com>
Cc:     kbuild-all@...org, linux-kernel@...r.kernel.org,
        Eric Dumazet <edumazet@...gle.com>
Subject: net/sched/act_police.c:232 tcf_police_init() warn: possible memory
 leak of 'new'

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   ef78e5ec9214376c5cb989f5da70b02d0c117b66
commit: f2cbd485282014132851bf37cb2ca624a456275d net/sched: act_police: fix race condition on state variables

smatch warnings:
net/sched/act_police.c:232 tcf_police_init() warn: possible memory leak of 'new'

# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f2cbd485282014132851bf37cb2ca624a456275d
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git remote update linus
git checkout f2cbd485282014132851bf37cb2ca624a456275d
vim +/new +232 net/sched/act_police.c

53b2bf3f8 net/sched/act_police.c Patrick McHardy   2008-01-23   82  
2ac063474 net/sched/act_police.c Jamal Hadi Salim  2018-08-12   83  static int tcf_police_init(struct net *net, struct nlattr *nla,
a85a970af net/sched/act_police.c WANG Cong         2016-07-25   84  			       struct nlattr *est, struct tc_action **a,
789871bb2 net/sched/act_police.c Vlad Buslov       2018-07-05   85  			       int ovr, int bind, bool rtnl_held,
589dad6d7 net/sched/act_police.c Alexander Aring   2018-02-15   86  			       struct netlink_ext_ack *extack)
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   87  {
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   88  	int ret = 0, err;
7ba699c60 net/sched/act_police.c Patrick McHardy   2008-01-22   89  	struct nlattr *tb[TCA_POLICE_MAX + 1];
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   90  	struct tc_police *parm;
e9ce1cd3c net/sched/act_police.c David S. Miller   2006-08-21   91  	struct tcf_police *police;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   92  	struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL;
ddf97ccdd net/sched/act_police.c WANG Cong         2016-02-22   93  	struct tc_action_net *tn = net_generic(net, police_net_id);
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13   94  	struct tcf_police_params *new;
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13   95  	bool exists = false;
1e9b3d533 net/sched/act_police.c Patrick McHardy   2006-11-30   96  	int size;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   97  
cee63723b net/sched/act_police.c Patrick McHardy   2008-01-23   98  	if (nla == NULL)
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16   99  		return -EINVAL;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  100  
fceb6435e net/sched/act_police.c Johannes Berg     2017-04-12  101  	err = nla_parse_nested(tb, TCA_POLICE_MAX, nla, police_policy, NULL);
cee63723b net/sched/act_police.c Patrick McHardy   2008-01-23  102  	if (err < 0)
cee63723b net/sched/act_police.c Patrick McHardy   2008-01-23  103  		return err;
cee63723b net/sched/act_police.c Patrick McHardy   2008-01-23  104  
7ba699c60 net/sched/act_police.c Patrick McHardy   2008-01-22  105  	if (tb[TCA_POLICE_TBF] == NULL)
1e9b3d533 net/sched/act_police.c Patrick McHardy   2006-11-30  106  		return -EINVAL;
7ba699c60 net/sched/act_police.c Patrick McHardy   2008-01-22  107  	size = nla_len(tb[TCA_POLICE_TBF]);
1e9b3d533 net/sched/act_police.c Patrick McHardy   2006-11-30  108  	if (size != sizeof(*parm) && size != sizeof(struct tc_police_compat))
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  109  		return -EINVAL;
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13  110  
7ba699c60 net/sched/act_police.c Patrick McHardy   2008-01-22  111  	parm = nla_data(tb[TCA_POLICE_TBF]);
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  112  	err = tcf_idr_check_alloc(tn, &parm->index, a, bind);
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  113  	if (err < 0)
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  114  		return err;
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  115  	exists = err;
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13  116  	if (exists && bind)
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13  117  		return 0;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  118  
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13  119  	if (!exists) {
65a206c01 net/sched/act_police.c Chris Mi          2017-08-30  120  		ret = tcf_idr_create(tn, parm->index, NULL, a,
93be42f91 net/sched/act_police.c Davide Caratti    2018-09-13  121  				     &act_police_ops, bind, true);
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  122  		if (ret) {
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  123  			tcf_idr_cleanup(tn, parm->index);
a03e6fe56 net/sched/act_police.c WANG Cong         2016-06-06  124  			return ret;
0190c1d45 net/sched/act_police.c Vlad Buslov       2018-07-05  125  		}
a03e6fe56 net/sched/act_police.c WANG Cong         2016-06-06  126  		ret = ACT_P_CREATED;
4e8ddd7f1 net/sched/act_police.c Vlad Buslov       2018-07-05  127  	} else if (!ovr) {
65a206c01 net/sched/act_police.c Chris Mi          2017-08-30  128  		tcf_idr_release(*a, bind);
0852e4552 net/sched/act_police.c WANG Cong         2016-08-13  129  		return -EEXIST;
e9ce1cd3c net/sched/act_police.c David S. Miller   2006-08-21  130  	}
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  131  
a85a970af net/sched/act_police.c WANG Cong         2016-07-25  132  	police = to_police(*a);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  133  	if (parm->rate.rate) {
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  134  		err = -ENOMEM;
e9bc3fa28 net/sched/act_police.c Alexander Aring   2017-12-20  135  		R_tab = qdisc_get_rtab(&parm->rate, tb[TCA_POLICE_RATE], NULL);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  136  		if (R_tab == NULL)
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  137  			goto failure;
c1b56878f net/sched/act_police.c Stephen Hemminger 2008-11-25  138  
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  139  		if (parm->peakrate.rate) {
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  140  			P_tab = qdisc_get_rtab(&parm->peakrate,
e9bc3fa28 net/sched/act_police.c Alexander Aring   2017-12-20  141  					       tb[TCA_POLICE_PEAKRATE], NULL);
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  142  			if (P_tab == NULL)
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  143  				goto failure;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  144  		}
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  145  	}
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  146  
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  147  	if (est) {
93be42f91 net/sched/act_police.c Davide Caratti    2018-09-13  148  		err = gen_replace_estimator(&police->tcf_bstats,
93be42f91 net/sched/act_police.c Davide Caratti    2018-09-13  149  					    police->common.cpu_bstats,
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  150  					    &police->tcf_rate_est,
edb09eb17 net/sched/act_police.c Eric Dumazet      2016-06-06  151  					    &police->tcf_lock,
edb09eb17 net/sched/act_police.c Eric Dumazet      2016-06-06  152  					    NULL, est);
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  153  		if (err)
74030603d net/sched/act_police.c WANG Cong         2017-06-13  154  			goto failure;
a883bf564 net/sched/act_police.c Jarek Poplawski   2009-03-04  155  	} else if (tb[TCA_POLICE_AVRATE] &&
a883bf564 net/sched/act_police.c Jarek Poplawski   2009-03-04  156  		   (ret == ACT_P_CREATED ||
1c0d32fde net/sched/act_police.c Eric Dumazet      2016-12-04  157  		    !gen_estimator_active(&police->tcf_rate_est))) {
a883bf564 net/sched/act_police.c Jarek Poplawski   2009-03-04  158  		err = -EINVAL;
74030603d net/sched/act_police.c WANG Cong         2017-06-13  159  		goto failure;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  160  	}
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  161  
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  162  	new = kzalloc(sizeof(*new), GFP_KERNEL);
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  163  	if (unlikely(!new)) {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  164  		err = -ENOMEM;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  165  		goto failure;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  166  	}
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  167  
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  168  	/* No failure allowed after this point */
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  169  	new->tcfp_mtu = parm->mtu;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  170  	if (!new->tcfp_mtu) {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  171  		new->tcfp_mtu = ~0;
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  172  		if (R_tab)
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  173  			new->tcfp_mtu = 255 << R_tab->rate.cell_log;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  174  	}
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  175  	if (R_tab) {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  176  		new->rate_present = true;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  177  		psched_ratecfg_precompute(&new->rate, &R_tab->rate, 0);
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  178  		qdisc_put_rtab(R_tab);
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  179  	} else {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  180  		new->rate_present = false;
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  181  	}
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  182  	if (P_tab) {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  183  		new->peak_present = true;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  184  		psched_ratecfg_precompute(&new->peak, &P_tab->rate, 0);
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  185  		qdisc_put_rtab(P_tab);
c6d14ff11 net/sched/act_police.c Jiri Pirko        2013-02-12  186  	} else {
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  187  		new->peak_present = false;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  188  	}
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  189  
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  190  	new->tcfp_burst = PSCHED_TICKS2NS(parm->burst);
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  191  	if (new->peak_present)
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  192  		new->tcfp_mtu_ptoks = (s64)psched_l2t_ns(&new->peak,
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  193  							 new->tcfp_mtu);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  194  
7ba699c60 net/sched/act_police.c Patrick McHardy   2008-01-22  195  	if (tb[TCA_POLICE_AVRATE])
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  196  		new->tcfp_ewma_rate = nla_get_u32(tb[TCA_POLICE_AVRATE]);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  197  
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  198  	if (tb[TCA_POLICE_RESULT]) {
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  199  		new->tcfp_result = nla_get_u32(tb[TCA_POLICE_RESULT]);
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  200  		if (TC_ACT_EXT_CMP(new->tcfp_result, TC_ACT_GOTO_CHAIN)) {
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  201  			NL_SET_ERR_MSG(extack,
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  202  				       "goto chain not allowed on fallback");
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  203  			err = -EINVAL;
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  204  			goto failure;
                                                                                        ^^^^^^^^^^^^

kfree_rcu(new, rcu); ?

c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  205  		}
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  206  	}
c08f5ed5d net/sched/act_police.c Davide Caratti    2018-10-20  207  
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  208  	spin_lock_bh(&police->tcf_lock);
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  209  	spin_lock_bh(&police->tcfp_lock);
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  210  	police->tcfp_t_c = ktime_get_ns();
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  211  	police->tcfp_toks = new->tcfp_burst;
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  212  	if (new->peak_present)
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  213  		police->tcfp_ptoks = new->tcfp_mtu_ptoks;
f2cbd4852 net/sched/act_police.c Davide Caratti    2018-11-20  214  	spin_unlock_bh(&police->tcfp_lock);
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  215  	police->tcf_action = parm->action;
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  216  	rcu_swap_protected(police->params,
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  217  			   new,
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  218  			   lockdep_is_held(&police->tcf_lock));
e9ce1cd3c net/sched/act_police.c David S. Miller   2006-08-21  219  	spin_unlock_bh(&police->tcf_lock);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  220  
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  221  	if (new)
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  222  		kfree_rcu(new, rcu);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  223  
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  224  	if (ret == ACT_P_CREATED)
2d550dbad net/sched/act_police.c Davide Caratti    2018-09-13  225  		tcf_idr_insert(tn, *a);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  226  	return ret;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  227  
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  228  failure:
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  229  	qdisc_put_rtab(P_tab);
71bcb09a5 net/sched/act_police.c Stephen Hemminger 2008-11-25  230  	qdisc_put_rtab(R_tab);
5bf7f8185 net/sched/act_police.c Davide Caratti    2018-03-19  231  	tcf_idr_release(*a, bind);
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16 @232  	return err;
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  233  }
^1da177e4 net/sched/police.c     Linus Torvalds    2005-04-16  234  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ