diff options
Diffstat (limited to 'ip/iptunnel.c')
-rw-r--r-- | ip/iptunnel.c | 62 |
1 files changed, 25 insertions, 37 deletions
diff --git a/ip/iptunnel.c b/ip/iptunnel.c index 65a4e6e9..208a1f06 100644 --- a/ip/iptunnel.c +++ b/ip/iptunnel.c @@ -60,12 +60,10 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto) static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) { int count = 0; - char medium[IFNAMSIZ]; + const char *medium = NULL; int isatap = 0; memset(p, 0, sizeof(*p)); - memset(&medium, 0, sizeof(medium)); - p->iph.version = 4; p->iph.ihl = 5; #ifndef IP_DF @@ -141,7 +139,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) p->iph.saddr = htonl(INADDR_ANY); } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); - strncpy(medium, *argv, IFNAMSIZ - 1); + medium = *argv; } else if (strcmp(*argv, "ttl") == 0 || strcmp(*argv, "hoplimit") == 0 || strcmp(*argv, "hlim") == 0) { @@ -180,11 +178,11 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) if (p->name[0]) duparg2("name", *argv); - strncpy(p->name, *argv, IFNAMSIZ - 1); + if (get_ifname(p->name, *argv)) + invarg("\"name\" not a valid ifname", *argv); if (cmd == SIOCCHGTUNNEL && count == 0) { - struct ip_tunnel_parm old_p; + struct ip_tunnel_parm old_p = {}; - memset(&old_p, 0, sizeof(old_p)); if (tnl_get_ioctl(*argv, &old_p)) return -1; *p = old_p; @@ -219,7 +217,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) } } - if (medium[0]) { + if (medium) { p->link = ll_name_to_index(medium); if (p->link == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", medium); @@ -296,26 +294,23 @@ static int do_del(int argc, char **argv) static void print_tunnel(struct ip_tunnel_parm *p) { - struct ip_tunnel_6rd ip6rd; + struct ip_tunnel_6rd ip6rd = {}; char s1[1024]; char s2[1024]; - memset(&ip6rd, 0, sizeof(ip6rd)); - /* Do not use format_host() for local addr, * symbolic name will not be useful. */ printf("%s: %s/ip remote %s local %s", p->name, tnl_strproto(p->iph.protocol), - p->iph.daddr ? format_host(AF_INET, 4, &p->iph.daddr, s1, sizeof(s1)) : "any", - p->iph.saddr ? rt_addr_n2a(AF_INET, 4, &p->iph.saddr, s2, sizeof(s2)) : "any"); + p->iph.daddr ? format_host_r(AF_INET, 4, &p->iph.daddr, s1, sizeof(s1)) : "any", + p->iph.saddr ? rt_addr_n2a_r(AF_INET, 4, &p->iph.saddr, s2, sizeof(s2)) : "any"); if (p->iph.protocol == IPPROTO_IPV6 && (p->i_flags & SIT_ISATAP)) { - struct ip_tunnel_prl prl[16]; + struct ip_tunnel_prl prl[16] = {}; int i; - memset(prl, 0, sizeof(prl)); prl[0].datalen = sizeof(prl) - sizeof(prl[0]); prl[0].addr = htonl(INADDR_ANY); @@ -324,7 +319,7 @@ static void print_tunnel(struct ip_tunnel_parm *p) if (prl[i].addr != htonl(INADDR_ANY)) { printf(" %s %s ", (prl[i].flags & PRL_DEFAULT) ? "pdr" : "pr", - format_host(AF_INET, 4, &prl[i].addr, s1, sizeof(s1))); + format_host(AF_INET, 4, &prl[i].addr)); } } } @@ -360,7 +355,7 @@ static void print_tunnel(struct ip_tunnel_parm *p) ip6rd.prefixlen); if (ip6rd.relay_prefix) { printf(" 6rd-relay_prefix %s/%u", - format_host(AF_INET, 4, &ip6rd.relay_prefix, s1, sizeof(s1)), + format_host(AF_INET, 4, &ip6rd.relay_prefix), ip6rd.relay_prefixlen); } } @@ -405,7 +400,7 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) while (fgets(buf, sizeof(buf), fp) != NULL) { char name[IFNAMSIZ]; int index, type; - struct ip_tunnel_parm p1; + struct ip_tunnel_parm p1 = {}; char *ptr; buf[sizeof(buf) - 1] = 0; @@ -427,7 +422,6 @@ static int do_tunnels_list(struct ip_tunnel_parm *p) } if (type != ARPHRD_TUNNEL && type != ARPHRD_IPGRE && type != ARPHRD_SIT) continue; - memset(&p1, 0, sizeof(p1)); if (tnl_get_ioctl(name, &p1)) continue; if ((p->link && p1.link != p->link) || @@ -470,14 +464,10 @@ static int do_show(int argc, char **argv) static int do_prl(int argc, char **argv) { - struct ip_tunnel_prl p; + struct ip_tunnel_prl p = {}; int count = 0; - int devname = 0; int cmd = 0; - char medium[IFNAMSIZ]; - - memset(&p, 0, sizeof(p)); - memset(&medium, 0, sizeof(medium)); + const char *medium = NULL; while (argc > 0) { if (strcmp(*argv, "prl-default") == 0) { @@ -498,8 +488,9 @@ static int do_prl(int argc, char **argv) count++; } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); - strncpy(medium, *argv, IFNAMSIZ-1); - devname++; + if (check_ifname(*argv)) + invarg("\"dev\" not a valid ifname", *argv); + medium = *argv; } else { fprintf(stderr, "Invalid PRL parameter \"%s\"\n", *argv); @@ -512,7 +503,7 @@ static int do_prl(int argc, char **argv) } argc--; argv++; } - if (devname == 0) { + if (!medium) { fprintf(stderr, "Must specify device\n"); exit(-1); } @@ -522,15 +513,11 @@ static int do_prl(int argc, char **argv) static int do_6rd(int argc, char **argv) { - struct ip_tunnel_6rd ip6rd; - int devname = 0; + struct ip_tunnel_6rd ip6rd = {}; int cmd = 0; - char medium[IFNAMSIZ]; + const char *medium = NULL; inet_prefix prefix; - memset(&ip6rd, 0, sizeof(ip6rd)); - memset(&medium, 0, sizeof(medium)); - while (argc > 0) { if (strcmp(*argv, "6rd-prefix") == 0) { NEXT_ARG(); @@ -550,8 +537,9 @@ static int do_6rd(int argc, char **argv) cmd = SIOCDEL6RD; } else if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); - strncpy(medium, *argv, IFNAMSIZ-1); - devname++; + if (check_ifname(*argv)) + invarg("\"dev\" not a valid ifname", *argv); + medium = *argv; } else { fprintf(stderr, "Invalid 6RD parameter \"%s\"\n", *argv); @@ -559,7 +547,7 @@ static int do_6rd(int argc, char **argv) } argc--; argv++; } - if (devname == 0) { + if (!medium) { fprintf(stderr, "Must specify device\n"); exit(-1); } |