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
parent
5a3d1703d2
commit
f7307b8290
8
cangw.c
8
cangw.c
|
|
@ -743,10 +743,18 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
src_ifindex = if_nametoindex(optarg);
|
src_ifindex = if_nametoindex(optarg);
|
||||||
|
if (!src_ifindex) {
|
||||||
|
perror("src if_nametoindex");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
dst_ifindex = if_nametoindex(optarg);
|
dst_ifindex = if_nametoindex(optarg);
|
||||||
|
if (!dst_ifindex) {
|
||||||
|
perror("dst if_nametoindex");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'X':
|
case 'X':
|
||||||
|
|
|
||||||
13
cansniffer.c
13
cansniffer.c
|
|
@ -332,14 +332,19 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
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]);
|
addr.can_ifindex = if_nametoindex(argv[optind]);
|
||||||
else
|
if (!addr.can_ifindex) {
|
||||||
addr.can_ifindex = 0; /* any can interface */
|
perror("if_nametoindex");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
perror("connect");
|
perror("bind");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[optind]);
|
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) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[optind]);
|
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) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
|
|
||||||
|
|
@ -234,6 +234,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[optind]);
|
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) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[optind]);
|
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) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
|
|
||||||
|
|
@ -350,6 +350,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
caddr.can_family = AF_CAN;
|
caddr.can_family = AF_CAN;
|
||||||
caddr.can_ifindex = if_nametoindex(argv[optind]);
|
caddr.can_ifindex = if_nametoindex(argv[optind]);
|
||||||
|
if (!caddr.can_ifindex) {
|
||||||
|
perror("if_nametoindex");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (bind(sc, (struct sockaddr *)&caddr, caddrlen) < 0) {
|
if (bind(sc, (struct sockaddr *)&caddr, caddrlen) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
|
|
||||||
|
|
@ -296,6 +296,11 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(if_name);
|
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));
|
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -501,6 +501,10 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
addr.can_family = AF_CAN;
|
addr.can_family = AF_CAN;
|
||||||
addr.can_ifindex = if_nametoindex(argv[2]);
|
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' */
|
/* disable reception of CAN frames until we are opened by 'O' */
|
||||||
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
|
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue