Skip to content

Commit 26111ab

Browse files
Phil Suttershemminger
authored andcommitted
ip{6, }tunnel: Avoid copying user-supplied interface name around
In both files' parse_args() functions as well as in iptunnel's do_prl() and do_6rd() functions, a user-supplied 'dev' parameter is uselessly copied into a temporary buffer before passing it to ll_name_to_index() or copying into a struct ifreq. Avoid this by just caching the argv pointer value until the later lookup/strcpy. Signed-off-by: Phil Sutter <phil@nwl.cc>
1 parent 4c0939a commit 26111ab

File tree

2 files changed

+12
-16
lines changed

2 files changed

+12
-16
lines changed

ip/ip6tunnel.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
136136
static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
137137
{
138138
int count = 0;
139-
char medium[IFNAMSIZ] = {};
139+
const char *medium = NULL;
140140

141141
while (argc > 0) {
142142
if (strcmp(*argv, "mode") == 0) {
@@ -180,7 +180,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
180180
memcpy(&p->laddr, &laddr.data, sizeof(p->laddr));
181181
} else if (strcmp(*argv, "dev") == 0) {
182182
NEXT_ARG();
183-
strncpy(medium, *argv, IFNAMSIZ - 1);
183+
medium = *argv;
184184
} else if (strcmp(*argv, "encaplimit") == 0) {
185185
NEXT_ARG();
186186
if (strcmp(*argv, "none") == 0) {
@@ -285,7 +285,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
285285
count++;
286286
argc--; argv++;
287287
}
288-
if (medium[0]) {
288+
if (medium) {
289289
p->link = ll_name_to_index(medium);
290290
if (p->link == 0) {
291291
fprintf(stderr, "Cannot find device \"%s\"\n", medium);

ip/iptunnel.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto)
6060
static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
6161
{
6262
int count = 0;
63-
char medium[IFNAMSIZ] = {};
63+
const char *medium = NULL;
6464
int isatap = 0;
6565

6666
memset(p, 0, sizeof(*p));
@@ -139,7 +139,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
139139
p->iph.saddr = htonl(INADDR_ANY);
140140
} else if (strcmp(*argv, "dev") == 0) {
141141
NEXT_ARG();
142-
strncpy(medium, *argv, IFNAMSIZ - 1);
142+
medium = *argv;
143143
} else if (strcmp(*argv, "ttl") == 0 ||
144144
strcmp(*argv, "hoplimit") == 0 ||
145145
strcmp(*argv, "hlim") == 0) {
@@ -216,7 +216,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
216216
}
217217
}
218218

219-
if (medium[0]) {
219+
if (medium) {
220220
p->link = ll_name_to_index(medium);
221221
if (p->link == 0) {
222222
fprintf(stderr, "Cannot find device \"%s\"\n", medium);
@@ -465,9 +465,8 @@ static int do_prl(int argc, char **argv)
465465
{
466466
struct ip_tunnel_prl p = {};
467467
int count = 0;
468-
int devname = 0;
469468
int cmd = 0;
470-
char medium[IFNAMSIZ] = {};
469+
const char *medium = NULL;
471470

472471
while (argc > 0) {
473472
if (strcmp(*argv, "prl-default") == 0) {
@@ -488,8 +487,7 @@ static int do_prl(int argc, char **argv)
488487
count++;
489488
} else if (strcmp(*argv, "dev") == 0) {
490489
NEXT_ARG();
491-
strncpy(medium, *argv, IFNAMSIZ-1);
492-
devname++;
490+
medium = *argv;
493491
} else {
494492
fprintf(stderr,
495493
"Invalid PRL parameter \"%s\"\n", *argv);
@@ -502,7 +500,7 @@ static int do_prl(int argc, char **argv)
502500
}
503501
argc--; argv++;
504502
}
505-
if (devname == 0) {
503+
if (!medium) {
506504
fprintf(stderr, "Must specify device\n");
507505
exit(-1);
508506
}
@@ -513,9 +511,8 @@ static int do_prl(int argc, char **argv)
513511
static int do_6rd(int argc, char **argv)
514512
{
515513
struct ip_tunnel_6rd ip6rd = {};
516-
int devname = 0;
517514
int cmd = 0;
518-
char medium[IFNAMSIZ] = {};
515+
const char *medium = NULL;
519516
inet_prefix prefix;
520517

521518
while (argc > 0) {
@@ -537,16 +534,15 @@ static int do_6rd(int argc, char **argv)
537534
cmd = SIOCDEL6RD;
538535
} else if (strcmp(*argv, "dev") == 0) {
539536
NEXT_ARG();
540-
strncpy(medium, *argv, IFNAMSIZ-1);
541-
devname++;
537+
medium = *argv;
542538
} else {
543539
fprintf(stderr,
544540
"Invalid 6RD parameter \"%s\"\n", *argv);
545541
exit(-1);
546542
}
547543
argc--; argv++;
548544
}
549-
if (devname == 0) {
545+
if (!medium) {
550546
fprintf(stderr, "Must specify device\n");
551547
exit(-1);
552548
}

0 commit comments

Comments
 (0)