isotptun: fix stringop-truncation warnings

Rework string handling for ioctl() syscalls for netdev name operations.

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
pull/145/head
Oliver Hartkopp 2019-08-25 18:20:37 +02:00
parent 319bd5de45
commit 1331c56393
1 changed files with 13 additions and 10 deletions

View File

@ -143,7 +143,7 @@ int main(int argc, char **argv)
extern int optind, opterr, optopt; extern int optind, opterr, optopt;
static int verbose; static int verbose;
unsigned char buffer[BUF_LEN]; unsigned char buffer[BUF_LEN];
static char name[IFNAMSIZ] = DEFAULT_NAME; static char name[sizeof(ifr.ifr_name)] = DEFAULT_NAME;
int nbytes; int nbytes;
int run_as_daemon = 0; int run_as_daemon = 0;
@ -164,7 +164,13 @@ int main(int argc, char **argv)
break; break;
case 'n': case 'n':
strncpy(name, optarg, IFNAMSIZ-1); if (strlen(optarg) > sizeof(name) - 1) {
print_usage(basename(argv[0]));
exit(EXIT_FAILURE);
}
/* ensure string termination */
memset(name, 0, sizeof(name));
strncpy(name, optarg, sizeof(name) - 1);
break; break;
case 'x': case 'x':
@ -299,17 +305,14 @@ int main(int argc, char **argv)
} }
} }
strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ); addr.can_family = AF_CAN;
ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name); addr.can_ifindex = if_nametoindex(argv[optind]);
if (!ifr.ifr_ifindex) { if (!addr.can_ifindex) {
perror_syslog("if_nametoindex"); perror_syslog("if_nametoindex");
close(s); close(s);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror_syslog("bind"); perror_syslog("bind");
close(s); close(s);
@ -325,8 +328,8 @@ int main(int argc, char **argv)
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
strncpy(ifr.ifr_name, name, IFNAMSIZ - 1); /* string termination is ensured at commandline option handling */
ifr.ifr_name[IFNAMSIZ - 1] = '\0'; strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
if (ioctl(t, TUNSETIFF, (void *) &ifr) < 0) { if (ioctl(t, TUNSETIFF, (void *) &ifr) < 0) {
perror_syslog("ioctl tunfd"); perror_syslog("ioctl tunfd");