diff options
-rw-r--r-- | net/sched/act_api.c | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 5cfb160df063..e3d2c78cb52c 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
@@ -652,27 +652,27 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq, | |||
652 | unsigned char *b = skb_tail_pointer(skb); | 652 | unsigned char *b = skb_tail_pointer(skb); |
653 | struct nlattr *nest; | 653 | struct nlattr *nest; |
654 | 654 | ||
655 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags); | 655 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*t), flags); |
656 | 656 | if (!nlh) | |
657 | t = NLMSG_DATA(nlh); | 657 | goto out_nlmsg_trim; |
658 | t = nlmsg_data(nlh); | ||
658 | t->tca_family = AF_UNSPEC; | 659 | t->tca_family = AF_UNSPEC; |
659 | t->tca__pad1 = 0; | 660 | t->tca__pad1 = 0; |
660 | t->tca__pad2 = 0; | 661 | t->tca__pad2 = 0; |
661 | 662 | ||
662 | nest = nla_nest_start(skb, TCA_ACT_TAB); | 663 | nest = nla_nest_start(skb, TCA_ACT_TAB); |
663 | if (nest == NULL) | 664 | if (nest == NULL) |
664 | goto nla_put_failure; | 665 | goto out_nlmsg_trim; |
665 | 666 | ||
666 | if (tcf_action_dump(skb, a, bind, ref) < 0) | 667 | if (tcf_action_dump(skb, a, bind, ref) < 0) |
667 | goto nla_put_failure; | 668 | goto out_nlmsg_trim; |
668 | 669 | ||
669 | nla_nest_end(skb, nest); | 670 | nla_nest_end(skb, nest); |
670 | 671 | ||
671 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; | 672 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; |
672 | return skb->len; | 673 | return skb->len; |
673 | 674 | ||
674 | nla_put_failure: | 675 | out_nlmsg_trim: |
675 | nlmsg_failure: | ||
676 | nlmsg_trim(skb, b); | 676 | nlmsg_trim(skb, b); |
677 | return -1; | 677 | return -1; |
678 | } | 678 | } |
@@ -799,19 +799,21 @@ static int tca_action_flush(struct net *net, struct nlattr *nla, | |||
799 | if (a->ops == NULL) | 799 | if (a->ops == NULL) |
800 | goto err_out; | 800 | goto err_out; |
801 | 801 | ||
802 | nlh = NLMSG_PUT(skb, pid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t)); | 802 | nlh = nlmsg_put(skb, pid, n->nlmsg_seq, RTM_DELACTION, sizeof(*t), 0); |
803 | t = NLMSG_DATA(nlh); | 803 | if (!nlh) |
804 | goto out_module_put; | ||
805 | t = nlmsg_data(nlh); | ||
804 | t->tca_family = AF_UNSPEC; | 806 | t->tca_family = AF_UNSPEC; |
805 | t->tca__pad1 = 0; | 807 | t->tca__pad1 = 0; |
806 | t->tca__pad2 = 0; | 808 | t->tca__pad2 = 0; |
807 | 809 | ||
808 | nest = nla_nest_start(skb, TCA_ACT_TAB); | 810 | nest = nla_nest_start(skb, TCA_ACT_TAB); |
809 | if (nest == NULL) | 811 | if (nest == NULL) |
810 | goto nla_put_failure; | 812 | goto out_module_put; |
811 | 813 | ||
812 | err = a->ops->walk(skb, &dcb, RTM_DELACTION, a); | 814 | err = a->ops->walk(skb, &dcb, RTM_DELACTION, a); |
813 | if (err < 0) | 815 | if (err < 0) |
814 | goto nla_put_failure; | 816 | goto out_module_put; |
815 | if (err == 0) | 817 | if (err == 0) |
816 | goto noflush_out; | 818 | goto noflush_out; |
817 | 819 | ||
@@ -828,8 +830,7 @@ static int tca_action_flush(struct net *net, struct nlattr *nla, | |||
828 | 830 | ||
829 | return err; | 831 | return err; |
830 | 832 | ||
831 | nla_put_failure: | 833 | out_module_put: |
832 | nlmsg_failure: | ||
833 | module_put(a->ops->owner); | 834 | module_put(a->ops->owner); |
834 | err_out: | 835 | err_out: |
835 | noflush_out: | 836 | noflush_out: |
@@ -919,18 +920,20 @@ static int tcf_add_notify(struct net *net, struct tc_action *a, | |||
919 | 920 | ||
920 | b = skb_tail_pointer(skb); | 921 | b = skb_tail_pointer(skb); |
921 | 922 | ||
922 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*t), flags); | 923 | nlh = nlmsg_put(skb, pid, seq, event, sizeof(*t), flags); |
923 | t = NLMSG_DATA(nlh); | 924 | if (!nlh) |
925 | goto out_kfree_skb; | ||
926 | t = nlmsg_data(nlh); | ||
924 | t->tca_family = AF_UNSPEC; | 927 | t->tca_family = AF_UNSPEC; |
925 | t->tca__pad1 = 0; | 928 | t->tca__pad1 = 0; |
926 | t->tca__pad2 = 0; | 929 | t->tca__pad2 = 0; |
927 | 930 | ||
928 | nest = nla_nest_start(skb, TCA_ACT_TAB); | 931 | nest = nla_nest_start(skb, TCA_ACT_TAB); |
929 | if (nest == NULL) | 932 | if (nest == NULL) |
930 | goto nla_put_failure; | 933 | goto out_kfree_skb; |
931 | 934 | ||
932 | if (tcf_action_dump(skb, a, 0, 0) < 0) | 935 | if (tcf_action_dump(skb, a, 0, 0) < 0) |
933 | goto nla_put_failure; | 936 | goto out_kfree_skb; |
934 | 937 | ||
935 | nla_nest_end(skb, nest); | 938 | nla_nest_end(skb, nest); |
936 | 939 | ||
@@ -942,8 +945,7 @@ static int tcf_add_notify(struct net *net, struct tc_action *a, | |||
942 | err = 0; | 945 | err = 0; |
943 | return err; | 946 | return err; |
944 | 947 | ||
945 | nla_put_failure: | 948 | out_kfree_skb: |
946 | nlmsg_failure: | ||
947 | kfree_skb(skb); | 949 | kfree_skb(skb); |
948 | return -1; | 950 | return -1; |
949 | } | 951 | } |
@@ -1062,7 +1064,7 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb) | |||
1062 | struct tc_action_ops *a_o; | 1064 | struct tc_action_ops *a_o; |
1063 | struct tc_action a; | 1065 | struct tc_action a; |
1064 | int ret = 0; | 1066 | int ret = 0; |
1065 | struct tcamsg *t = (struct tcamsg *) NLMSG_DATA(cb->nlh); | 1067 | struct tcamsg *t = (struct tcamsg *) nlmsg_data(cb->nlh); |
1066 | struct nlattr *kind = find_dump_kind(cb->nlh); | 1068 | struct nlattr *kind = find_dump_kind(cb->nlh); |
1067 | 1069 | ||
1068 | if (kind == NULL) { | 1070 | if (kind == NULL) { |
@@ -1080,23 +1082,25 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb) | |||
1080 | if (a_o->walk == NULL) { | 1082 | if (a_o->walk == NULL) { |
1081 | WARN(1, "tc_dump_action: %s !capable of dumping table\n", | 1083 | WARN(1, "tc_dump_action: %s !capable of dumping table\n", |
1082 | a_o->kind); | 1084 | a_o->kind); |
1083 | goto nla_put_failure; | 1085 | goto out_module_put; |
1084 | } | 1086 | } |
1085 | 1087 | ||
1086 | nlh = NLMSG_PUT(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, | 1088 | nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, |
1087 | cb->nlh->nlmsg_type, sizeof(*t)); | 1089 | cb->nlh->nlmsg_type, sizeof(*t), 0); |
1088 | t = NLMSG_DATA(nlh); | 1090 | if (!nlh) |
1091 | goto out_module_put; | ||
1092 | t = nlmsg_data(nlh); | ||
1089 | t->tca_family = AF_UNSPEC; | 1093 | t->tca_family = AF_UNSPEC; |
1090 | t->tca__pad1 = 0; | 1094 | t->tca__pad1 = 0; |
1091 | t->tca__pad2 = 0; | 1095 | t->tca__pad2 = 0; |
1092 | 1096 | ||
1093 | nest = nla_nest_start(skb, TCA_ACT_TAB); | 1097 | nest = nla_nest_start(skb, TCA_ACT_TAB); |
1094 | if (nest == NULL) | 1098 | if (nest == NULL) |
1095 | goto nla_put_failure; | 1099 | goto out_module_put; |
1096 | 1100 | ||
1097 | ret = a_o->walk(skb, cb, RTM_GETACTION, &a); | 1101 | ret = a_o->walk(skb, cb, RTM_GETACTION, &a); |
1098 | if (ret < 0) | 1102 | if (ret < 0) |
1099 | goto nla_put_failure; | 1103 | goto out_module_put; |
1100 | 1104 | ||
1101 | if (ret > 0) { | 1105 | if (ret > 0) { |
1102 | nla_nest_end(skb, nest); | 1106 | nla_nest_end(skb, nest); |
@@ -1110,8 +1114,7 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb) | |||
1110 | module_put(a_o->owner); | 1114 | module_put(a_o->owner); |
1111 | return skb->len; | 1115 | return skb->len; |
1112 | 1116 | ||
1113 | nla_put_failure: | 1117 | out_module_put: |
1114 | nlmsg_failure: | ||
1115 | module_put(a_o->owner); | 1118 | module_put(a_o->owner); |
1116 | nlmsg_trim(skb, b); | 1119 | nlmsg_trim(skb, b); |
1117 | return skb->len; | 1120 | return skb->len; |