]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/iproute_lwtunnel.c
Merge branch 'iproute2-master' into iproute2-next
[mirror_iproute2.git] / ip / iproute_lwtunnel.c
index 5ee37f715eca628b3ee73b67b1e15159c3d9c8da..85ab13cb31746b4ecf25c86e0d4ceb956dc57b2b 100644 (file)
@@ -494,10 +494,11 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
        struct seg6_iptunnel_encap *tuninfo;
        struct ipv6_sr_hdr *srh;
        char **argv = *argvp;
-       char segbuf[1024];
+       char segbuf[1024] = "";
        int argc = *argcp;
        int encap = -1;
        __u32 hmac = 0;
+       int ret = 0;
        int srhlen;
 
        while (argc > 0) {
@@ -539,16 +540,19 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp,
        memcpy(tuninfo->srh, srh, srhlen);
 
        if (rta_addattr_l(rta, len, SEG6_IPTUNNEL_SRH, tuninfo,
-                         sizeof(*tuninfo) + srhlen))
-               return -1;
-
-       free(tuninfo);
-       free(srh);
+                         sizeof(*tuninfo) + srhlen)) {
+               ret = -1;
+               goto out;
+       }
 
        *argcp = argc + 1;
        *argvp = argv - 1;
 
-       return 0;
+out:
+       free(tuninfo);
+       free(srh);
+
+       return ret;
 }
 
 struct lwt_x {
@@ -856,7 +860,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
 
        argc--; argv++;
 
-       if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator))
+       if (rta_addattr64(rta, len, ILA_ATTR_LOCATOR, locator))
                return -1;
 
        while (argc > 0) {
@@ -870,7 +874,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
                                invarg("\"csum-mode\" value is invalid\n",
                                       *argv);
 
-                       ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
+                       ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE,
                                           (__u8)csum_mode);
 
                        argc--; argv++;
@@ -884,7 +888,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
                                invarg("\"ident-type\" value is invalid\n",
                                       *argv);
 
-                       ret = rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE,
+                       ret = rta_addattr8(rta, len, ILA_ATTR_IDENT_TYPE,
                                           (__u8)ident_type);
 
                        argc--; argv++;
@@ -898,7 +902,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
                                invarg("\"hook-type\" value is invalid\n",
                                       *argv);
 
-                       ret = rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE,
+                       ret = rta_addattr8(rta, len, ILA_ATTR_HOOK_TYPE,
                                           (__u8)hook_type);
 
                        argc--; argv++;
@@ -1030,7 +1034,7 @@ static int parse_encap_bpf(struct rtattr *rta, size_t len, int *argcp,
                        if (get_unsigned(&headroom, *argv, 0) || headroom == 0)
                                invarg("headroom is invalid\n", *argv);
                        if (!headroom_set)
-                               rta_addattr32(rta, 1024, LWT_BPF_XMIT_HEADROOM,
+                               rta_addattr32(rta, len, LWT_BPF_XMIT_HEADROOM,
                                              headroom);
                        headroom_set = 1;
                } else if (strcmp(*argv, "help") == 0) {
@@ -1071,7 +1075,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
                exit(-1);
        }
 
-       nest = rta_nest(rta, 1024, RTA_ENCAP);
+       nest = rta_nest(rta, len, RTA_ENCAP);
        switch (type) {
        case LWTUNNEL_ENCAP_MPLS:
                ret = parse_encap_mpls(rta, len, &argc, &argv);
@@ -1104,7 +1108,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
 
        rta_nest_end(rta, nest);
 
-       ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type);
+       ret = rta_addattr16(rta, len, RTA_ENCAP_TYPE, type);
 
        *argcp = argc;
        *argvp = argv;