]> rtime.felk.cvut.cz Git - can-utils.git/commitdiff
treewide: use if_nametoindex to avoid overflows
authorSven Schmitt <sven.schmitt@gmx.net>
Wed, 24 Jun 2015 13:33:20 +0000 (15:33 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 30 Jun 2015 19:00:04 +0000 (21:00 +0200)
replaced strcpy(if_name, argv[x]) + ioctl by if_idx = if_nametoindex(argv[x])
to avoid overflows caused by long user input.

Signed-off-by: Sven Schmitt <sven.schmitt@gmx.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
canfdtest.c
cansend.c
isotpdump.c
isotprecv.c
isotpsend.c
isotpserver.c
isotpsniffer.c
isotptun.c
slcanpty.c

index 28b204263aaad2b72bf6611e39ff6d8ab91b5853..24070278109fcd8a956fb1ae9eecfa8f47812617 100644 (file)
@@ -312,7 +312,6 @@ static int can_echo_gen(void)
 
 int main(int argc, char *argv[])
 {
-       struct ifreq ifr;
        struct sockaddr_can addr;
        char *intf_name;
        int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW;
@@ -356,9 +355,7 @@ int main(int argc, char *argv[])
        }
 
        addr.can_family = family;
-       strcpy(ifr.ifr_name, intf_name);
-       ioctl(sockfd, SIOCGIFINDEX, &ifr);
-       addr.can_ifindex = ifr.ifr_ifindex;
+       addr.can_ifindex = if_nametoindex(intf_name);
 
        if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
                perror("bind");
index aec64a5c9e61af458eafed6980a07ec9050f8e51..b7f800339b521eddd5729860b792a072345ed00a 100644 (file)
--- a/cansend.c
+++ b/cansend.c
@@ -94,13 +94,15 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       addr.can_family = AF_CAN;
-
-       strcpy(ifr.ifr_name, argv[1]);
-       if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
-               perror("SIOCGIFINDEX");
+       strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
+       ifr.ifr_name[IFNAMSIZ - 1] = '\0';
+       ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
+       if (!ifr.ifr_ifindex) {
+               perror("if_nametoindex");
                return 1;
        }
+
+       addr.can_family = AF_CAN;
        addr.can_ifindex = ifr.ifr_ifindex;
 
        if (required_mtu > CAN_MTU) {
index 6e64eefba5d4463f78c7024f935d9161b0f264cb..b2b650aa7996b48627a381d1702703f705c2f193 100644 (file)
@@ -96,8 +96,6 @@ int main(int argc, char **argv)
        int timestamp = 0;
        int datidx = 0;
        unsigned long fflen = 0;
-       struct ifreq ifr;
-       int ifindex;
        struct timeval tv, last_tv;
        unsigned int n_pci;
        int opt;
@@ -202,12 +200,8 @@ int main(int argc, char **argv)
 
        setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
 
-       strcpy(ifr.ifr_name, argv[optind]);
-       ioctl(s, SIOCGIFINDEX, &ifr);
-       ifindex = ifr.ifr_ifindex;
-
        addr.can_family = AF_CAN;
-       addr.can_ifindex = ifindex;
+       addr.can_ifindex = if_nametoindex(argv[optind]);
 
        if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
                perror("bind");
index 5c4f2a5f11ceca33805b0fdca805e1af75c12578..763da39315efe600ca03336c7858dada6165995b 100644 (file)
@@ -81,7 +81,6 @@ int main(int argc, char **argv)
 {
     int s;
     struct sockaddr_can addr;
-    struct ifreq ifr;
     static struct can_isotp_options opts;
     static struct can_isotp_fc_options fcopts;
     static struct can_isotp_ll_options llopts;
@@ -232,9 +231,7 @@ int main(int argc, char **argv)
            setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_RX_STMIN, &force_rx_stmin, sizeof(force_rx_stmin));
 
     addr.can_family = AF_CAN;
-    strcpy(ifr.ifr_name, argv[optind]);
-    ioctl(s, SIOCGIFINDEX, &ifr);
-    addr.can_ifindex = ifr.ifr_ifindex;
+    addr.can_ifindex = if_nametoindex(argv[optind]);
 
     if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("bind");
index e0256cb9083ecd025ed53a84b31d5d68cb52c70d..b6a56708fb4d8c71afa34c6396ef079fe261fa8e 100644 (file)
@@ -79,7 +79,6 @@ int main(int argc, char **argv)
 {
     int s;
     struct sockaddr_can addr;
-    struct ifreq ifr;
     static struct can_isotp_options opts;
     static struct can_isotp_ll_options llopts;
     int opt;
@@ -224,9 +223,7 @@ int main(int argc, char **argv)
            setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_TX_STMIN, &force_tx_stmin, sizeof(force_tx_stmin));
 
     addr.can_family = AF_CAN;
-    strcpy(ifr.ifr_name, argv[optind]);
-    ioctl(s, SIOCGIFINDEX, &ifr);
-    addr.can_ifindex = ifr.ifr_ifindex;
+    addr.can_ifindex = if_nametoindex(argv[optind]);
 
     if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("bind");
index b900f279b01dd04427974213b21710161204f0a6..7c0c1eeb5aa2737455d6ef90cd89812237a42236 100644 (file)
@@ -137,7 +137,6 @@ int main(int argc, char **argv)
        static struct can_isotp_options opts;
        static struct can_isotp_fc_options fcopts;
        static struct can_isotp_ll_options llopts;
-       struct ifreq ifr;
        socklen_t sin_size = sizeof(clientaddr);
        socklen_t caddrlen = sizeof(caddr);
 
@@ -345,12 +344,7 @@ int main(int argc, char **argv)
        }
 
        caddr.can_family = AF_CAN;
-       strcpy(ifr.ifr_name, argv[optind]);
-       if (ioctl(sc, SIOCGIFINDEX, &ifr) < 0) {
-               perror("SIOCGIFINDEX");
-               exit(1);
-       }
-       caddr.can_ifindex = ifr.ifr_ifindex;
+       caddr.can_ifindex = if_nametoindex(argv[optind]);
 
        if (bind(sc, (struct sockaddr *)&caddr, caddrlen) < 0) {
                perror("bind");
index 7618dca549a04b50453e8d47291fb6e02a9775cb..f42e18bff8f3364c37cb82c5a1cd66ccae3e7557 100644 (file)
@@ -175,7 +175,7 @@ int main(int argc, char **argv)
        fd_set rdfs;
        int s, t;
        struct sockaddr_can addr;
-       struct ifreq ifr;
+       char if_name[IFNAMSIZ];
        static struct can_isotp_options opts;
        int opt, quit = 0;
        int color = 0;
@@ -271,10 +271,11 @@ int main(int argc, char **argv)
 
        opts.flags |= CAN_ISOTP_LISTEN_MODE;
 
+       strncpy(if_name, argv[optind], IFNAMSIZ - 1);
+       if_name[IFNAMSIZ - 1] = '\0';
+
        addr.can_family = AF_CAN;
-       strcpy(ifr.ifr_name, argv[optind]);
-       ioctl(s, SIOCGIFINDEX, &ifr);
-       addr.can_ifindex = ifr.ifr_ifindex;
+       addr.can_ifindex = if_nametoindex(if_name);
 
        setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
 
@@ -334,7 +335,7 @@ int main(int argc, char **argv)
                        if (nbytes > 4095)
                                return -1;
                        printbuf(buffer, nbytes, color?2:0, timestamp, format,
-                                &tv, &last_tv, dst, s, ifr.ifr_name, head);
+                                &tv, &last_tv, dst, s, if_name, head);
                }
 
                if (FD_ISSET(t, &rdfs)) {
@@ -346,7 +347,7 @@ int main(int argc, char **argv)
                        if (nbytes > 4095)
                                return -1;
                        printbuf(buffer, nbytes, color?1:0, timestamp, format,
-                                &tv, &last_tv, src, t, ifr.ifr_name, head);
+                                &tv, &last_tv, src, t, if_name, head);
                }
        }
 
index c793f42015fb080c84fc88ed35fb1dbf1d04cfe7..fc2a8d57bf2fc81201c2c06d895d439667946c5b 100644 (file)
@@ -265,9 +265,15 @@ int main(int argc, char **argv)
                }
        }
 
+       strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
+       ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
+       if (!ifr.ifr_ifindex) {
+               perror("if_nametoindex");
+               close(s);
+               exit(1);
+       }
+
        addr.can_family = AF_CAN;
-       strcpy(ifr.ifr_name, argv[optind]);
-       ioctl(s, SIOCGIFINDEX, &ifr);
        addr.can_ifindex = ifr.ifr_ifindex;
 
        if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
@@ -285,7 +291,8 @@ int main(int argc, char **argv)
 
        memset(&ifr, 0, sizeof(ifr));
        ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
-       strncpy(ifr.ifr_name, name, IFNAMSIZ);
+       strncpy(ifr.ifr_name, name, IFNAMSIZ - 1);
+       ifr.ifr_name[IFNAMSIZ - 1] = '\0';
 
        if (ioctl(t, TUNSETIFF, (void *) &ifr) < 0) {
                perror("ioctl tunfd");
index f485ac775a533b2bfdbb5cd34ee1f564c7ae0abe..5cf14ef9837450262be6220f1af28e453c0f364d 100644 (file)
@@ -422,7 +422,6 @@ int main(int argc, char **argv)
        int s; /* can raw socket */ 
        struct sockaddr_can addr;
        struct termios topts;
-       struct ifreq ifr;
        int select_stdin = 0;
        int running = 1;
        int tstamp = 0;
@@ -497,13 +496,7 @@ int main(int argc, char **argv)
        }
 
        addr.can_family = AF_CAN;
-
-       strcpy(ifr.ifr_name, argv[2]);
-       if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {
-               perror("SIOCGIFINDEX");
-               return 1;
-       }
-       addr.can_ifindex = ifr.ifr_ifindex;
+       addr.can_ifindex = if_nametoindex(argv[2]);
 
        /* disable reception of CAN frames until we are opened by 'O' */
        setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);