can-utils: check for return values of if_nametoindex()

if_nametoindex() returns zero and a specific errno in the case the network
interface does not exist. The missing check leads to the use of the 'any'
CAN device but leaves the user alone as the user gets no error message.

Reported-by: Lothar Rubusch <lotophagon@protonmail.com>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
pull/318/head
Oliver Hartkopp 2021-10-18 09:28:02 +02:00
parent 5a3d1703d2
commit f7307b8290
9 changed files with 46 additions and 4 deletions

View File

@ -743,10 +743,18 @@ int main(int argc, char **argv)
case 's':
src_ifindex = if_nametoindex(optarg);
if (!src_ifindex) {
perror("src if_nametoindex");
exit(1);
}
break;
case 'd':
dst_ifindex = if_nametoindex(optarg);
if (!dst_ifindex) {
perror("dst if_nametoindex");
exit(1);
}
break;
case 'X':

View File

@ -332,14 +332,19 @@ int main(int argc, char **argv)
}
addr.can_family = AF_CAN;
addr.can_ifindex = 0; /* 'any' CAN interface */
if (strcmp(ANYDEV, argv[optind]) != 0)
/* check for specific CAN interface */
if (strcmp(ANYDEV, argv[optind]) != 0) {
addr.can_ifindex = if_nametoindex(argv[optind]);
else
addr.can_ifindex = 0; /* any can interface */
if (!addr.can_ifindex) {
perror("if_nametoindex");
return 1;
}
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("connect");
perror("bind");
return 1;
}

View File

@ -325,6 +325,10 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
return 1;
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");

View File

@ -189,6 +189,10 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
return 1;
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");

View File

@ -234,6 +234,10 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
exit(1);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");

View File

@ -237,6 +237,10 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
exit(1);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");

View File

@ -350,6 +350,10 @@ int main(int argc, char **argv)
caddr.can_family = AF_CAN;
caddr.can_ifindex = if_nametoindex(argv[optind]);
if (!caddr.can_ifindex) {
perror("if_nametoindex");
exit(1);
}
if (bind(sc, (struct sockaddr *)&caddr, caddrlen) < 0) {
perror("bind");

View File

@ -296,6 +296,11 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(if_name);
if (!addr.can_ifindex) {
perror("if_nametoindex");
r = 1;
goto out;
}
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));

View File

@ -501,6 +501,10 @@ int main(int argc, char **argv)
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[2]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
return 1;
}
/* disable reception of CAN frames until we are opened by 'O' */
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);