@@ -3692,16 +3692,14 @@ static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm,
3692
3692
static int __rtnl_newlink (struct sk_buff * skb , struct nlmsghdr * nlh ,
3693
3693
const struct rtnl_link_ops * ops ,
3694
3694
struct rtnl_newlink_tbs * tbs ,
3695
+ struct nlattr * * data ,
3695
3696
struct netlink_ext_ack * extack )
3696
3697
{
3697
- struct nlattr * * const linkinfo = tbs -> linkinfo ;
3698
3698
struct nlattr * * const tb = tbs -> tb ;
3699
3699
struct net * net = sock_net (skb -> sk );
3700
3700
struct net_device * dev ;
3701
3701
struct ifinfomsg * ifm ;
3702
- struct nlattr * * data ;
3703
3702
bool link_specified ;
3704
- int err ;
3705
3703
3706
3704
ifm = nlmsg_data (nlh );
3707
3705
if (ifm -> ifi_index > 0 ) {
@@ -3718,26 +3716,6 @@ static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3718
3716
dev = NULL ;
3719
3717
}
3720
3718
3721
- data = NULL ;
3722
- if (ops ) {
3723
- if (ops -> maxtype > RTNL_MAX_TYPE )
3724
- return - EINVAL ;
3725
-
3726
- if (ops -> maxtype && linkinfo [IFLA_INFO_DATA ]) {
3727
- err = nla_parse_nested_deprecated (tbs -> attr , ops -> maxtype ,
3728
- linkinfo [IFLA_INFO_DATA ],
3729
- ops -> policy , extack );
3730
- if (err < 0 )
3731
- return err ;
3732
- data = tbs -> attr ;
3733
- }
3734
- if (ops -> validate ) {
3735
- err = ops -> validate (tb , data , extack );
3736
- if (err < 0 )
3737
- return err ;
3738
- }
3739
- }
3740
-
3741
3719
if (dev )
3742
3720
return rtnl_changelink (skb , nlh , ops , dev , tbs , data , extack );
3743
3721
@@ -3768,8 +3746,8 @@ static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3768
3746
static int rtnl_newlink (struct sk_buff * skb , struct nlmsghdr * nlh ,
3769
3747
struct netlink_ext_ack * extack )
3770
3748
{
3749
+ struct nlattr * * tb , * * linkinfo , * * data = NULL ;
3771
3750
const struct rtnl_link_ops * ops = NULL ;
3772
- struct nlattr * * tb , * * linkinfo ;
3773
3751
struct rtnl_newlink_tbs * tbs ;
3774
3752
int ret ;
3775
3753
@@ -3813,7 +3791,28 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3813
3791
#endif
3814
3792
}
3815
3793
3816
- ret = __rtnl_newlink (skb , nlh , ops , tbs , extack );
3794
+ if (ops ) {
3795
+ if (ops -> maxtype > RTNL_MAX_TYPE )
3796
+ return - EINVAL ;
3797
+
3798
+ if (ops -> maxtype && linkinfo [IFLA_INFO_DATA ]) {
3799
+ ret = nla_parse_nested_deprecated (tbs -> attr , ops -> maxtype ,
3800
+ linkinfo [IFLA_INFO_DATA ],
3801
+ ops -> policy , extack );
3802
+ if (ret < 0 )
3803
+ goto free ;
3804
+
3805
+ data = tbs -> attr ;
3806
+ }
3807
+
3808
+ if (ops -> validate ) {
3809
+ ret = ops -> validate (tb , data , extack );
3810
+ if (ret < 0 )
3811
+ goto free ;
3812
+ }
3813
+ }
3814
+
3815
+ ret = __rtnl_newlink (skb , nlh , ops , tbs , data , extack );
3817
3816
3818
3817
free :
3819
3818
kfree (tbs );
0 commit comments