From f7307b829025d347c816ba4492d5319bc70a53ea Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Mon, 18 Oct 2021 09:28:02 +0200 Subject: [PATCH] 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 Signed-off-by: Oliver Hartkopp --- cangw.c | 8 ++++++++ cansniffer.c | 13 +++++++++---- isotpdump.c | 4 ++++ isotpperf.c | 4 ++++ isotprecv.c | 4 ++++ isotpsend.c | 4 ++++ isotpserver.c | 4 ++++ isotpsniffer.c | 5 +++++ slcanpty.c | 4 ++++ 9 files changed, 46 insertions(+), 4 deletions(-) diff --git a/cangw.c b/cangw.c index bf45331..6369a9f 100644 --- a/cangw.c +++ b/cangw.c @@ -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': diff --git a/cansniffer.c b/cansniffer.c index 4e9d47d..4089431 100644 --- a/cansniffer.c +++ b/cansniffer.c @@ -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; } diff --git a/isotpdump.c b/isotpdump.c index 6869cc6..4e2dbaf 100644 --- a/isotpdump.c +++ b/isotpdump.c @@ -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"); diff --git a/isotpperf.c b/isotpperf.c index 97bf4cf..6252ac9 100644 --- a/isotpperf.c +++ b/isotpperf.c @@ -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"); diff --git a/isotprecv.c b/isotprecv.c index 406cf5d..4b41022 100644 --- a/isotprecv.c +++ b/isotprecv.c @@ -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"); diff --git a/isotpsend.c b/isotpsend.c index 3ea574c..6fe1b99 100644 --- a/isotpsend.c +++ b/isotpsend.c @@ -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"); diff --git a/isotpserver.c b/isotpserver.c index ed61bb2..5c161d7 100644 --- a/isotpserver.c +++ b/isotpserver.c @@ -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"); diff --git a/isotpsniffer.c b/isotpsniffer.c index a06ecef..bdd8211 100644 --- a/isotpsniffer.c +++ b/isotpsniffer.c @@ -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)); diff --git a/slcanpty.c b/slcanpty.c index d233c0d..e6f1efe 100644 --- a/slcanpty.c +++ b/slcanpty.c @@ -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);