Commit cee63723 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[NET_SCHED]: Propagate nla_parse return value

nla_parse() returns more detailed errno codes, propagate them back on
error.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab27cfb8
...@@ -473,17 +473,18 @@ struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est, ...@@ -473,17 +473,18 @@ struct tc_action *tcf_action_init_1(struct nlattr *nla, struct nlattr *est,
struct nlattr *kind; struct nlattr *kind;
int err; int err;
err = -EINVAL;
if (name == NULL) { if (name == NULL) {
if (nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL) < 0) err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
if (err < 0)
goto err_out; goto err_out;
err = -EINVAL;
kind = tb[TCA_ACT_KIND]; kind = tb[TCA_ACT_KIND];
if (kind == NULL) if (kind == NULL)
goto err_out; goto err_out;
if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ) if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ)
goto err_out; goto err_out;
} else { } else {
err = -EINVAL;
if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ) if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ)
goto err_out; goto err_out;
} }
...@@ -548,10 +549,12 @@ struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est, ...@@ -548,10 +549,12 @@ struct tc_action *tcf_action_init(struct nlattr *nla, struct nlattr *est,
{ {
struct nlattr *tb[TCA_ACT_MAX_PRIO+1]; struct nlattr *tb[TCA_ACT_MAX_PRIO+1];
struct tc_action *head = NULL, *act, *act_prev = NULL; struct tc_action *head = NULL, *act, *act_prev = NULL;
int err;
int i; int i;
if (nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL) < 0) err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL);
return ERR_PTR(-EINVAL); if (err < 0)
return ERR_PTR(err);
for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) { for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
act = tcf_action_init_1(tb[i], est, name, ovr, bind); act = tcf_action_init_1(tb[i], est, name, ovr, bind);
...@@ -674,10 +677,11 @@ tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 pid) ...@@ -674,10 +677,11 @@ tcf_action_get_1(struct nlattr *nla, struct nlmsghdr *n, u32 pid)
int index; int index;
int err; int err;
err = -EINVAL; err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
if (nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL) < 0) if (err < 0)
goto err_out; goto err_out;
err = -EINVAL;
if (tb[TCA_ACT_INDEX] == NULL || if (tb[TCA_ACT_INDEX] == NULL ||
nla_len(tb[TCA_ACT_INDEX]) < sizeof(index)) nla_len(tb[TCA_ACT_INDEX]) < sizeof(index))
goto err_out; goto err_out;
...@@ -759,9 +763,11 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid) ...@@ -759,9 +763,11 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid)
b = skb_tail_pointer(skb); b = skb_tail_pointer(skb);
if (nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL) < 0) err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL);
if (err < 0)
goto err_out; goto err_out;
err = -EINVAL;
kind = tb[TCA_ACT_KIND]; kind = tb[TCA_ACT_KIND];
a->ops = tc_lookup_action(kind); a->ops = tc_lookup_action(kind);
if (a->ops == NULL) if (a->ops == NULL)
...@@ -804,12 +810,13 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid) ...@@ -804,12 +810,13 @@ static int tca_action_flush(struct nlattr *nla, struct nlmsghdr *n, u32 pid)
static int static int
tca_action_gd(struct nlattr *nla, struct nlmsghdr *n, u32 pid, int event) tca_action_gd(struct nlattr *nla, struct nlmsghdr *n, u32 pid, int event)
{ {
int i, ret = 0; int i, ret;
struct nlattr *tb[TCA_ACT_MAX_PRIO+1]; struct nlattr *tb[TCA_ACT_MAX_PRIO+1];
struct tc_action *head = NULL, *act, *act_prev = NULL; struct tc_action *head = NULL, *act, *act_prev = NULL;
if (nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL) < 0) ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL);
return -EINVAL; if (ret < 0)
return ret;
if (event == RTM_DELACTION && n->nlmsg_flags&NLM_F_ROOT) { if (event == RTM_DELACTION && n->nlmsg_flags&NLM_F_ROOT) {
if (tb[0] != NULL && tb[1] == NULL) if (tb[0] != NULL && tb[1] == NULL)
......
...@@ -61,10 +61,15 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, ...@@ -61,10 +61,15 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est,
struct tcf_gact *gact; struct tcf_gact *gact;
struct tcf_common *pc; struct tcf_common *pc;
int ret = 0; int ret = 0;
int err;
if (nla == NULL || nla_parse_nested(tb, TCA_GACT_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_GACT_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_GACT_PARMS] == NULL || if (tb[TCA_GACT_PARMS] == NULL ||
nla_len(tb[TCA_GACT_PARMS]) < sizeof(*parm)) nla_len(tb[TCA_GACT_PARMS]) < sizeof(*parm))
return -EINVAL; return -EINVAL;
......
...@@ -104,9 +104,13 @@ static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est, ...@@ -104,9 +104,13 @@ static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est,
u32 hook = 0; u32 hook = 0;
u32 index = 0; u32 index = 0;
if (nla == NULL || nla_parse_nested(tb, TCA_IPT_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_IPT_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_IPT_HOOK] == NULL || if (tb[TCA_IPT_HOOK] == NULL ||
nla_len(tb[TCA_IPT_HOOK]) < sizeof(u32)) nla_len(tb[TCA_IPT_HOOK]) < sizeof(u32))
return -EINVAL; return -EINVAL;
......
...@@ -62,12 +62,16 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, ...@@ -62,12 +62,16 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est,
struct tcf_mirred *m; struct tcf_mirred *m;
struct tcf_common *pc; struct tcf_common *pc;
struct net_device *dev = NULL; struct net_device *dev = NULL;
int ret = 0; int ret = 0, err;
int ok_push = 0; int ok_push = 0;
if (nla == NULL || nla_parse_nested(tb, TCA_MIRRED_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_MIRRED_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_MIRRED_PARMS] == NULL || if (tb[TCA_MIRRED_PARMS] == NULL ||
nla_len(tb[TCA_MIRRED_PARMS]) < sizeof(*parm)) nla_len(tb[TCA_MIRRED_PARMS]) < sizeof(*parm))
return -EINVAL; return -EINVAL;
......
...@@ -45,13 +45,17 @@ static int tcf_nat_init(struct nlattr *nla, struct nlattr *est, ...@@ -45,13 +45,17 @@ static int tcf_nat_init(struct nlattr *nla, struct nlattr *est,
{ {
struct nlattr *tb[TCA_NAT_MAX + 1]; struct nlattr *tb[TCA_NAT_MAX + 1];
struct tc_nat *parm; struct tc_nat *parm;
int ret = 0; int ret = 0, err;
struct tcf_nat *p; struct tcf_nat *p;
struct tcf_common *pc; struct tcf_common *pc;
if (nla == NULL || nla_parse_nested(tb, TCA_NAT_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_NAT_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_NAT_PARMS] == NULL || if (tb[TCA_NAT_PARMS] == NULL ||
nla_len(tb[TCA_NAT_PARMS]) < sizeof(*parm)) nla_len(tb[TCA_NAT_PARMS]) < sizeof(*parm))
return -EINVAL; return -EINVAL;
......
...@@ -38,15 +38,19 @@ static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, ...@@ -38,15 +38,19 @@ static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est,
{ {
struct nlattr *tb[TCA_PEDIT_MAX + 1]; struct nlattr *tb[TCA_PEDIT_MAX + 1];
struct tc_pedit *parm; struct tc_pedit *parm;
int ret = 0; int ret = 0, err;
struct tcf_pedit *p; struct tcf_pedit *p;
struct tcf_common *pc; struct tcf_common *pc;
struct tc_pedit_key *keys = NULL; struct tc_pedit_key *keys = NULL;
int ksize; int ksize;
if (nla == NULL || nla_parse_nested(tb, TCA_PEDIT_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_PEDIT_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_PEDIT_PARMS] == NULL || if (tb[TCA_PEDIT_PARMS] == NULL ||
nla_len(tb[TCA_PEDIT_PARMS]) < sizeof(*parm)) nla_len(tb[TCA_PEDIT_PARMS]) < sizeof(*parm))
return -EINVAL; return -EINVAL;
......
...@@ -129,9 +129,13 @@ static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est, ...@@ -129,9 +129,13 @@ static int tcf_act_police_locate(struct nlattr *nla, struct nlattr *est,
struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL; struct qdisc_rate_table *R_tab = NULL, *P_tab = NULL;
int size; int size;
if (nla == NULL || nla_parse_nested(tb, TCA_POLICE_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_POLICE_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_POLICE_TBF] == NULL) if (tb[TCA_POLICE_TBF] == NULL)
return -EINVAL; return -EINVAL;
size = nla_len(tb[TCA_POLICE_TBF]); size = nla_len(tb[TCA_POLICE_TBF]);
......
...@@ -93,11 +93,15 @@ static int tcf_simp_init(struct nlattr *nla, struct nlattr *est, ...@@ -93,11 +93,15 @@ static int tcf_simp_init(struct nlattr *nla, struct nlattr *est,
struct tcf_common *pc; struct tcf_common *pc;
void *defdata; void *defdata;
u32 datalen = 0; u32 datalen = 0;
int ret = 0; int ret = 0, err;
if (nla == NULL || nla_parse_nested(tb, TCA_DEF_MAX, nla, NULL) < 0) if (nla == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_DEF_MAX, nla, NULL);
if (err < 0)
return err;
if (tb[TCA_DEF_PARMS] == NULL || if (tb[TCA_DEF_PARMS] == NULL ||
nla_len(tb[TCA_DEF_PARMS]) < sizeof(*parm)) nla_len(tb[TCA_DEF_PARMS]) < sizeof(*parm))
return -EINVAL; return -EINVAL;
......
...@@ -166,7 +166,7 @@ static inline int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f, ...@@ -166,7 +166,7 @@ static inline int basic_set_parms(struct tcf_proto *tp, struct basic_filter *f,
static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle, static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
struct nlattr **tca, unsigned long *arg) struct nlattr **tca, unsigned long *arg)
{ {
int err = -EINVAL; int err;
struct basic_head *head = (struct basic_head *) tp->root; struct basic_head *head = (struct basic_head *) tp->root;
struct nlattr *tb[TCA_BASIC_MAX + 1]; struct nlattr *tb[TCA_BASIC_MAX + 1];
struct basic_filter *f = (struct basic_filter *) *arg; struct basic_filter *f = (struct basic_filter *) *arg;
...@@ -174,8 +174,9 @@ static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle, ...@@ -174,8 +174,9 @@ static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
if (tca[TCA_OPTIONS] == NULL) if (tca[TCA_OPTIONS] == NULL)
return -EINVAL; return -EINVAL;
if (nla_parse_nested(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS], NULL) < 0) err = nla_parse_nested(tb, TCA_BASIC_MAX, tca[TCA_OPTIONS], NULL);
return -EINVAL; if (err < 0)
return err;
if (f != NULL) { if (f != NULL) {
if (handle && f->handle != handle) if (handle && f->handle != handle)
......
...@@ -246,8 +246,9 @@ static int fw_change(struct tcf_proto *tp, unsigned long base, ...@@ -246,8 +246,9 @@ static int fw_change(struct tcf_proto *tp, unsigned long base,
if (!opt) if (!opt)
return handle ? -EINVAL : 0; return handle ? -EINVAL : 0;
if (nla_parse_nested(tb, TCA_FW_MAX, opt, NULL) < 0) err = nla_parse_nested(tb, TCA_FW_MAX, opt, NULL);
return -EINVAL; if (err < 0)
return err;
if (f != NULL) { if (f != NULL) {
if (f->id != handle && handle) if (f->id != handle && handle)
......
...@@ -440,8 +440,9 @@ static int route4_change(struct tcf_proto *tp, unsigned long base, ...@@ -440,8 +440,9 @@ static int route4_change(struct tcf_proto *tp, unsigned long base,
if (opt == NULL) if (opt == NULL)
return handle ? -EINVAL : 0; return handle ? -EINVAL : 0;
if (nla_parse_nested(tb, TCA_ROUTE4_MAX, opt, NULL) < 0) err = nla_parse_nested(tb, TCA_ROUTE4_MAX, opt, NULL);
return -EINVAL; if (err < 0)
return err;
if ((f = (struct route4_filter*)*arg) != NULL) { if ((f = (struct route4_filter*)*arg) != NULL) {
if (f->handle != handle && handle) if (f->handle != handle && handle)
......
...@@ -416,8 +416,9 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base, ...@@ -416,8 +416,9 @@ static int rsvp_change(struct tcf_proto *tp, unsigned long base,
if (opt == NULL) if (opt == NULL)
return handle ? -EINVAL : 0; return handle ? -EINVAL : 0;
if (nla_parse_nested(tb, TCA_RSVP_MAX, opt, NULL) < 0) err = nla_parse_nested(tb, TCA_RSVP_MAX, opt, NULL);
return -EINVAL; if (err < 0)
return err;
err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &rsvp_ext_map); err = tcf_exts_validate(tp, tb, tca[TCA_RATE-1], &e, &rsvp_ext_map);
if (err < 0) if (err < 0)
......
...@@ -350,6 +350,7 @@ tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle, ...@@ -350,6 +350,7 @@ tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle,
struct nlattr *tb[TCA_TCINDEX_MAX + 1]; struct nlattr *tb[TCA_TCINDEX_MAX + 1];
struct tcindex_data *p = PRIV(tp); struct tcindex_data *p = PRIV(tp);
struct tcindex_filter_result *r = (struct tcindex_filter_result *) *arg; struct tcindex_filter_result *r = (struct tcindex_filter_result *) *arg;
int err;
pr_debug("tcindex_change(tp %p,handle 0x%08x,tca %p,arg %p),opt %p," pr_debug("tcindex_change(tp %p,handle 0x%08x,tca %p,arg %p),opt %p,"
"p %p,r %p,*arg 0x%lx\n", "p %p,r %p,*arg 0x%lx\n",
...@@ -358,8 +359,9 @@ tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle, ...@@ -358,8 +359,9 @@ tcindex_change(struct tcf_proto *tp, unsigned long base, u32 handle,
if (!opt) if (!opt)
return 0; return 0;
if (nla_parse_nested(tb, TCA_TCINDEX_MAX, opt, NULL) < 0) err = nla_parse_nested(tb, TCA_TCINDEX_MAX, opt, NULL);
return -EINVAL; if (err < 0)
return err;
return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]); return tcindex_set_parms(tp, base, handle, p, r, tb, tca[TCA_RATE]);
} }
......
...@@ -531,8 +531,9 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, ...@@ -531,8 +531,9 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
if (opt == NULL) if (opt == NULL)
return handle ? -EINVAL : 0; return handle ? -EINVAL : 0;
if (nla_parse_nested(tb, TCA_U32_MAX, opt, NULL) < 0) err = nla_parse_nested(tb, TCA_U32_MAX, opt, NULL);
return -EINVAL; if (err < 0)
return err;
if ((n = (struct tc_u_knode*)*arg) != NULL) { if ((n = (struct tc_u_knode*)*arg) != NULL) {
if (TC_U32_KEY(n->handle) == 0) if (TC_U32_KEY(n->handle) == 0)
......
...@@ -749,14 +749,16 @@ static inline int meta_is_supported(struct meta_value *val) ...@@ -749,14 +749,16 @@ static inline int meta_is_supported(struct meta_value *val)
static int em_meta_change(struct tcf_proto *tp, void *data, int len, static int em_meta_change(struct tcf_proto *tp, void *data, int len,
struct tcf_ematch *m) struct tcf_ematch *m)
{ {
int err = -EINVAL; int err;
struct nlattr *tb[TCA_EM_META_MAX + 1]; struct nlattr *tb[TCA_EM_META_MAX + 1];
struct tcf_meta_hdr *hdr; struct tcf_meta_hdr *hdr;
struct meta_match *meta = NULL; struct meta_match *meta = NULL;
if (nla_parse(tb, TCA_EM_META_MAX, data, len, NULL) < 0) err = nla_parse(tb, TCA_EM_META_MAX, data, len, NULL);
if (err < 0)
goto errout; goto errout;
err = -EINVAL;
if (tb[TCA_EM_META_HDR] == NULL || if (tb[TCA_EM_META_HDR] == NULL ||
nla_len(tb[TCA_EM_META_HDR]) < sizeof(*hdr)) nla_len(tb[TCA_EM_META_HDR]) < sizeof(*hdr))
goto errout; goto errout;
......
...@@ -301,7 +301,7 @@ static int tcf_em_validate(struct tcf_proto *tp, ...@@ -301,7 +301,7 @@ static int tcf_em_validate(struct tcf_proto *tp,
int tcf_em_tree_validate(struct tcf_proto *tp, struct nlattr *nla, int tcf_em_tree_validate(struct tcf_proto *tp, struct nlattr *nla,
struct tcf_ematch_tree *tree) struct tcf_ematch_tree *tree)
{ {
int idx, list_len, matches_len, err = -EINVAL; int idx, list_len, matches_len, err;
struct nlattr *tb[TCA_EMATCH_TREE_MAX + 1]; struct nlattr *tb[TCA_EMATCH_TREE_MAX + 1];
struct nlattr *rt_match, *rt_hdr, *rt_list; struct nlattr *rt_match, *rt_hdr, *rt_list;
struct tcf_ematch_tree_hdr *tree_hdr; struct tcf_ematch_tree_hdr *tree_hdr;
...@@ -312,9 +312,11 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct nlattr *nla, ...@@ -312,9 +312,11 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct nlattr *nla,
return 0; return 0;
} }
if (nla_parse_nested(tb, TCA_EMATCH_TREE_MAX, nla, NULL) < 0) err = nla_parse_nested(tb, TCA_EMATCH_TREE_MAX, nla, NULL);
if (err < 0)
goto errout; goto errout;
err = -EINVAL;
rt_hdr = tb[TCA_EMATCH_TREE_HDR]; rt_hdr = tb[TCA_EMATCH_TREE_HDR];
rt_list = tb[TCA_EMATCH_TREE_LIST]; rt_list = tb[TCA_EMATCH_TREE_LIST];
......
...@@ -223,8 +223,12 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent, ...@@ -223,8 +223,12 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
*/ */
if (flow) if (flow)
return -EBUSY; return -EBUSY;
if (opt == NULL || nla_parse_nested(tb, TCA_ATM_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
error = nla_parse_nested(tb, TCA_ATM_MAX, opt, NULL);
if (error < 0)
return error;
if (!tb[TCA_ATM_FD] || nla_len(tb[TCA_ATM_FD]) < sizeof(fd)) if (!tb[TCA_ATM_FD] || nla_len(tb[TCA_ATM_FD]) < sizeof(fd))
return -EINVAL; return -EINVAL;
fd = *(int *)nla_data(tb[TCA_ATM_FD]); fd = *(int *)nla_data(tb[TCA_ATM_FD]);
......
...@@ -1382,9 +1382,13 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt) ...@@ -1382,9 +1382,13 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt)
struct cbq_sched_data *q = qdisc_priv(sch); struct cbq_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_CBQ_MAX + 1]; struct nlattr *tb[TCA_CBQ_MAX + 1];
struct tc_ratespec *r; struct tc_ratespec *r;
int err;
err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, NULL);
if (err < 0)
return err;
if (nla_parse_nested(tb, TCA_CBQ_MAX, opt, NULL) < 0 || if (tb[TCA_CBQ_RTAB] == NULL || tb[TCA_CBQ_RATE] == NULL ||
tb[TCA_CBQ_RTAB] == NULL || tb[TCA_CBQ_RATE] == NULL ||
nla_len(tb[TCA_CBQ_RATE]) < sizeof(struct tc_ratespec)) nla_len(tb[TCA_CBQ_RATE]) < sizeof(struct tc_ratespec))
return -EINVAL; return -EINVAL;
...@@ -1764,9 +1768,13 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t ...@@ -1764,9 +1768,13 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
struct cbq_class *parent; struct cbq_class *parent;
struct qdisc_rate_table *rtab = NULL; struct qdisc_rate_table *rtab = NULL;
if (opt==NULL || nla_parse_nested(tb, TCA_CBQ_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_CBQ_OVL_STRATEGY] && if (tb[TCA_CBQ_OVL_STRATEGY] &&
nla_len(tb[TCA_CBQ_OVL_STRATEGY]) < sizeof(struct tc_cbq_ovl)) nla_len(tb[TCA_CBQ_OVL_STRATEGY]) < sizeof(struct tc_cbq_ovl))
return -EINVAL; return -EINVAL;
......
...@@ -116,9 +116,14 @@ static int dsmark_change(struct Qdisc *sch, u32 classid, u32 parent, ...@@ -116,9 +116,14 @@ static int dsmark_change(struct Qdisc *sch, u32 classid, u32 parent,
goto errout; goto errout;
} }
if (!opt || nla_parse_nested(tb, TCA_DSMARK_MAX, opt, NULL)) if (!opt)
goto errout; goto errout;
err = nla_parse_nested(tb, TCA_DSMARK_MAX, opt, NULL);
if (err < 0)
return err;
err = -EINVAL;
if (tb[TCA_DSMARK_MASK]) { if (tb[TCA_DSMARK_MASK]) {
if (nla_len(tb[TCA_DSMARK_MASK]) < sizeof(u8)) if (nla_len(tb[TCA_DSMARK_MASK]) < sizeof(u8))
goto errout; goto errout;
...@@ -351,9 +356,14 @@ static int dsmark_init(struct Qdisc *sch, struct nlattr *opt) ...@@ -351,9 +356,14 @@ static int dsmark_init(struct Qdisc *sch, struct nlattr *opt)
pr_debug("dsmark_init(sch %p,[qdisc %p],opt %p)\n", sch, p, opt); pr_debug("dsmark_init(sch %p,[qdisc %p],opt %p)\n", sch, p, opt);
if (!opt || nla_parse_nested(tb, TCA_DSMARK_MAX, opt, NULL) < 0) if (!opt)
goto errout;
err = nla_parse_nested(tb, TCA_DSMARK_MAX, opt, NULL);
if (err < 0)
goto errout; goto errout;
err = -EINVAL;
if (nla_len(tb[TCA_DSMARK_INDICES]) < sizeof(u16)) if (nla_len(tb[TCA_DSMARK_INDICES]) < sizeof(u16))
goto errout; goto errout;
indices = nla_get_u16(tb[TCA_DSMARK_INDICES]); indices = nla_get_u16(tb[TCA_DSMARK_INDICES]);
......
...@@ -430,12 +430,16 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -430,12 +430,16 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
struct gred_sched *table = qdisc_priv(sch); struct gred_sched *table = qdisc_priv(sch);
struct tc_gred_qopt *ctl; struct tc_gred_qopt *ctl;
struct nlattr *tb[TCA_GRED_MAX + 1]; struct nlattr *tb[TCA_GRED_MAX + 1];
int err = -EINVAL, prio = GRED_DEF_PRIO; int err, prio = GRED_DEF_PRIO;
u8 *stab; u8 *stab;
if (opt == NULL || nla_parse_nested(tb, TCA_GRED_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_GRED_MAX, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL) if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL)
return gred_change_table_def(sch, opt); return gred_change_table_def(sch, opt);
...@@ -445,6 +449,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -445,6 +449,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
nla_len(tb[TCA_GRED_STAB]) < 256) nla_len(tb[TCA_GRED_STAB]) < 256)
return -EINVAL; return -EINVAL;
err = -EINVAL;
ctl = nla_data(tb[TCA_GRED_PARMS]); ctl = nla_data(tb[TCA_GRED_PARMS]);
stab = nla_data(tb[TCA_GRED_STAB]); stab = nla_data(tb[TCA_GRED_STAB]);
...@@ -489,10 +494,15 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -489,10 +494,15 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt)
static int gred_init(struct Qdisc *sch, struct nlattr *opt) static int gred_init(struct Qdisc *sch, struct nlattr *opt)
{ {
struct nlattr *tb[TCA_GRED_MAX + 1]; struct nlattr *tb[TCA_GRED_MAX + 1];
int err;
if (opt == NULL || nla_parse_nested(tb, TCA_GRED_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_GRED_MAX, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_GRED_PARMS] || tb[TCA_GRED_STAB]) if (tb[TCA_GRED_PARMS] || tb[TCA_GRED_STAB])
return -EINVAL; return -EINVAL;
......
...@@ -997,10 +997,15 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, ...@@ -997,10 +997,15 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
struct nlattr *tb[TCA_HFSC_MAX + 1]; struct nlattr *tb[TCA_HFSC_MAX + 1];
struct tc_service_curve *rsc = NULL, *fsc = NULL, *usc = NULL; struct tc_service_curve *rsc = NULL, *fsc = NULL, *usc = NULL;
u64 cur_time; u64 cur_time;
int err;
if (opt == NULL || nla_parse_nested(tb, TCA_HFSC_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_HFSC_MAX, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_HFSC_RSC]) { if (tb[TCA_HFSC_RSC]) {
if (nla_len(tb[TCA_HFSC_RSC]) < sizeof(*rsc)) if (nla_len(tb[TCA_HFSC_RSC]) < sizeof(*rsc))
return -EINVAL; return -EINVAL;
......
...@@ -997,9 +997,17 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt) ...@@ -997,9 +997,17 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt)
struct htb_sched *q = qdisc_priv(sch); struct htb_sched *q = qdisc_priv(sch);
struct nlattr *tb[TCA_HTB_INIT + 1]; struct nlattr *tb[TCA_HTB_INIT + 1];
struct tc_htb_glob *gopt; struct tc_htb_glob *gopt;
int err;
int i; int i;
if (!opt || nla_parse_nested(tb, TCA_HTB_INIT, opt, NULL) ||
tb[TCA_HTB_INIT] == NULL || if (!opt)
return -EINVAL;
err = nla_parse_nested(tb, TCA_HTB_INIT, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_HTB_INIT] == NULL ||
nla_len(tb[TCA_HTB_INIT]) < sizeof(*gopt)) { nla_len(tb[TCA_HTB_INIT]) < sizeof(*gopt)) {
printk(KERN_ERR "HTB: hey probably you have bad tc tool ?\n"); printk(KERN_ERR "HTB: hey probably you have bad tc tool ?\n");
return -EINVAL; return -EINVAL;
...@@ -1302,8 +1310,15 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, ...@@ -1302,8 +1310,15 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
struct tc_htb_opt *hopt; struct tc_htb_opt *hopt;
/* extract all subattrs from opt attr */ /* extract all subattrs from opt attr */
if (!opt || nla_parse_nested(tb, TCA_HTB_RTAB, opt, NULL) || if (!opt)
tb[TCA_HTB_PARMS] == NULL || goto failure;
err = nla_parse_nested(tb, TCA_HTB_RTAB, opt, NULL);
if (err < 0)
goto failure;
err = -EINVAL;
if (tb[TCA_HTB_PARMS] == NULL ||
nla_len(tb[TCA_HTB_PARMS]) < sizeof(*hopt)) nla_len(tb[TCA_HTB_PARMS]) < sizeof(*hopt))
goto failure; goto failure;
......
...@@ -229,11 +229,14 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) ...@@ -229,11 +229,14 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)
struct prio_sched_data *q = qdisc_priv(sch); struct prio_sched_data *q = qdisc_priv(sch);
struct tc_prio_qopt *qopt; struct tc_prio_qopt *qopt;
struct nlattr *tb[TCA_PRIO_MAX + 1]; struct nlattr *tb[TCA_PRIO_MAX + 1];
int err;
int i; int i;
if (nla_parse_nested_compat(tb, TCA_PRIO_MAX, opt, NULL, qopt, err = nla_parse_nested_compat(tb, TCA_PRIO_MAX, opt, NULL, qopt,
sizeof(*qopt))) sizeof(*qopt));
return -EINVAL; if (err < 0)
return err;
q->bands = qopt->bands; q->bands = qopt->bands;
/* If we're multiqueue, make sure the number of incoming bands /* If we're multiqueue, make sure the number of incoming bands
* matches the number of queues on the device we're associating with. * matches the number of queues on the device we're associating with.
......
...@@ -207,10 +207,15 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -207,10 +207,15 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt)
struct nlattr *tb[TCA_RED_MAX + 1]; struct nlattr *tb[TCA_RED_MAX + 1];
struct tc_red_qopt *ctl; struct tc_red_qopt *ctl;
struct Qdisc *child = NULL; struct Qdisc *child = NULL;
int err;
if (opt == NULL || nla_parse_nested(tb, TCA_RED_MAX, opt, NULL)) if (opt == NULL)
return -EINVAL; return -EINVAL;
err = nla_parse_nested(tb, TCA_RED_MAX, opt, NULL);
if (err < 0)
return err;
if (tb[TCA_RED_PARMS] == NULL || if (tb[TCA_RED_PARMS] == NULL ||
nla_len(tb[TCA_RED_PARMS]) < sizeof(*ctl) || nla_len(tb[TCA_RED_PARMS]) < sizeof(*ctl) ||
tb[TCA_RED_STAB] == NULL || tb[TCA_RED_STAB] == NULL ||
......
...@@ -272,7 +272,7 @@ static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit) ...@@ -272,7 +272,7 @@ static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
static int tbf_change(struct Qdisc* sch, struct nlattr *opt) static int tbf_change(struct Qdisc* sch, struct nlattr *opt)
{ {
int err = -EINVAL; int err;
struct tbf_sched_data *q = qdisc_priv(sch); struct tbf_sched_data *q = qdisc_priv(sch);
struct nlattr *tb[TCA_TBF_PTAB + 1]; struct nlattr *tb[TCA_TBF_PTAB + 1];
struct tc_tbf_qopt *qopt; struct tc_tbf_qopt *qopt;
...@@ -281,8 +281,12 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt) ...@@ -281,8 +281,12 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)
struct Qdisc *child = NULL; struct Qdisc *child = NULL;
int max_size,n; int max_size,n;
if (nla_parse_nested(tb, TCA_TBF_PTAB, opt, NULL) || err = nla_parse_nested(tb, TCA_TBF_PTAB, opt, NULL);
tb[TCA_TBF_PARMS] == NULL || if (err < 0)
return err;
err = -EINVAL;
if (tb[TCA_TBF_PARMS] == NULL ||
nla_len(tb[TCA_TBF_PARMS]) < sizeof(*qopt)) nla_len(tb[TCA_TBF_PARMS]) < sizeof(*qopt))
goto done; goto done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment