aboutsummaryrefslogtreecommitdiff
path: root/ip/iptunnel.c
diff options
context:
space:
mode:
Diffstat (limited to 'ip/iptunnel.c')
-rw-r--r--ip/iptunnel.c62
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);
}