All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] treewide: use if_nametoindex to avoid overflows
@ 2015-06-24 18:22 Marc Kleine-Budde
  2015-06-24 18:25 ` Marc Kleine-Budde
  0 siblings, 1 reply; 4+ messages in thread
From: Marc Kleine-Budde @ 2015-06-24 18:22 UTC (permalink / raw)
  To: linux-can; +Cc: Sven Schmitt

From: Sven Schmitt <sven.schmitt@volkswagen.de>

replaced strcpy(if_name, argv[x]) by if_name=if_nametoindex(argv[x]) to avoid
overflows caused by long user input.

Waiting for Sob: Sven Schmitt <sven.schmitt@volkswagen.de>
Not-yet-Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
This came via github.

Marc

 canfdtest.c    |  5 +----
 cansend.c      | 11 ++++++-----
 isotpdump.c    |  8 +-------
 isotprecv.c    |  5 +----
 isotpsend.c    |  5 +----
 isotpserver.c  |  7 +------
 isotpsniffer.c |  9 +++++++--
 isotptun.c     | 10 ++++++++--
 slcanpty.c     |  9 +--------
 9 files changed, 27 insertions(+), 42 deletions(-)

diff --git a/canfdtest.c b/canfdtest.c
index 28b204263aaa..24070278109f 100644
--- a/canfdtest.c
+++ b/canfdtest.c
@@ -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");
diff --git a/cansend.c b/cansend.c
index aec64a5c9e61..a0b9bbbfb25d 100644
--- a/cansend.c
+++ b/cansend.c
@@ -94,13 +94,14 @@ 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);
+	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) {
diff --git a/isotpdump.c b/isotpdump.c
index 6e64eefba5d4..b2b650aa7996 100644
--- a/isotpdump.c
+++ b/isotpdump.c
@@ -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");
diff --git a/isotprecv.c b/isotprecv.c
index 5c4f2a5f11ce..763da39315ef 100644
--- a/isotprecv.c
+++ b/isotprecv.c
@@ -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");
diff --git a/isotpsend.c b/isotpsend.c
index e0256cb9083e..b6a56708fb4d 100644
--- a/isotpsend.c
+++ b/isotpsend.c
@@ -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");
diff --git a/isotpserver.c b/isotpserver.c
index b900f279b01d..403585b18b9f 100644
--- a/isotpserver.c
+++ b/isotpserver.c
@@ -345,12 +345,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");
diff --git a/isotpsniffer.c b/isotpsniffer.c
index 7618dca549a0..9182fcc240b6 100644
--- a/isotpsniffer.c
+++ b/isotpsniffer.c
@@ -271,9 +271,14 @@ int main(int argc, char **argv)
 
 	opts.flags |= CAN_ISOTP_LISTEN_MODE;
 
+	strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
+	ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
+	if (!ifr.ifr_ifindex) {
+		perror("if_nametoindex");
+		return 1;
+	}
+
 	addr.can_family = AF_CAN;
-	strcpy(ifr.ifr_name, argv[optind]);
-	ioctl(s, SIOCGIFINDEX, &ifr);
 	addr.can_ifindex = ifr.ifr_ifindex;
 
 	setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
diff --git a/isotptun.c b/isotptun.c
index c793f42015fb..400e1b74e8bd 100644
--- a/isotptun.c
+++ b/isotptun.c
@@ -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) {
diff --git a/slcanpty.c b/slcanpty.c
index f485ac775a53..5cf14ef98374 100644
--- a/slcanpty.c
+++ b/slcanpty.c
@@ -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);
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] treewide: use if_nametoindex to avoid overflows
  2015-06-24 18:22 [PATCH] treewide: use if_nametoindex to avoid overflows Marc Kleine-Budde
@ 2015-06-24 18:25 ` Marc Kleine-Budde
  0 siblings, 0 replies; 4+ messages in thread
From: Marc Kleine-Budde @ 2015-06-24 18:25 UTC (permalink / raw)
  To: linux-can; +Cc: Sven Schmitt

[-- Attachment #1: Type: text/plain, Size: 1287 bytes --]

Hey Sven,

Thanks for your contribution. I forwarded your patch to the linux-can
mailinglist.

On 06/24/2015 08:22 PM, Marc Kleine-Budde wrote:
> From: Sven Schmitt <sven.schmitt@volkswagen.de>
> 
> replaced strcpy(if_name, argv[x]) by if_name=if_nametoindex(argv[x]) to avoid
> overflows caused by long user input.
> 
> Waiting for Sob: Sven Schmitt <sven.schmitt@volkswagen.de>
> Not-yet-Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

Can I add your S-o-B here? What S-o-B means is explained here [1].

Patch looks good, but the compiler throws a warning here:

> cc -O2 -Wall -Wno-parentheses -fno-strict-aliasing -Iinclude -D_FILE_OFFSET_BITS=64 -DSO_RXQ_OVFL=40 -DPF_CAN=29 -DAF_CAN=PF_CAN   isotpserver.c   -o isotpserver
> isotpserver.c: In function ‘main’:
> isotpserver.c:140:15: warning: unused variable ‘ifr’ [-Wunused-variable]
>   struct ifreq ifr;
>                ^

Marc

[1]
http://lxr.free-electrons.com/source/Documentation/SubmittingPatches#L407

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] treewide: use if_nametoindex to avoid overflows
  2015-06-25  7:24 Marc Kleine-Budde
@ 2015-06-25  7:28 ` Marc Kleine-Budde
  0 siblings, 0 replies; 4+ messages in thread
From: Marc Kleine-Budde @ 2015-06-25  7:28 UTC (permalink / raw)
  To: linux-can; +Cc: Sven Schmitt

[-- Attachment #1: Type: text/plain, Size: 8157 bytes --]

On 06/25/2015 09:24 AM, Marc Kleine-Budde wrote:
> From: Sven Schmitt <sven.schmitt@gmx.net>
> 
> 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>
> ---
> I got a S-o-b meanwhile:
> 
> https://github.com/linux-can/can-utils/pull/4
> 
> Marc
> 
>  canfdtest.c    |  5 +----
>  cansend.c      | 11 ++++++-----
>  isotpdump.c    |  8 +-------
>  isotprecv.c    |  5 +----
>  isotpsend.c    |  5 +----
>  isotpserver.c  |  8 +-------
>  isotpsniffer.c |  9 +++++++--
>  isotptun.c     | 10 ++++++++--
>  slcanpty.c     |  9 +--------
>  9 files changed, 27 insertions(+), 43 deletions(-)
> 
> diff --git a/canfdtest.c b/canfdtest.c
> index 28b204263aaa..24070278109f 100644
> --- a/canfdtest.c
> +++ b/canfdtest.c
> @@ -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");
> diff --git a/cansend.c b/cansend.c
> index aec64a5c9e61..a0b9bbbfb25d 100644
> --- a/cansend.c
> +++ b/cansend.c
> @@ -94,13 +94,14 @@ 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);
> +	ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);

Why do you copy the name to ifr_ifindex and not call if_nametoindex
directly, as you do in the other commands?

> +	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) {
> diff --git a/isotpdump.c b/isotpdump.c
> index 6e64eefba5d4..b2b650aa7996 100644
> --- a/isotpdump.c
> +++ b/isotpdump.c
> @@ -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");
> diff --git a/isotprecv.c b/isotprecv.c
> index 5c4f2a5f11ce..763da39315ef 100644
> --- a/isotprecv.c
> +++ b/isotprecv.c
> @@ -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");
> diff --git a/isotpsend.c b/isotpsend.c
> index e0256cb9083e..b6a56708fb4d 100644
> --- a/isotpsend.c
> +++ b/isotpsend.c
> @@ -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");
> diff --git a/isotpserver.c b/isotpserver.c
> index b900f279b01d..7c0c1eeb5aa2 100644
> --- a/isotpserver.c
> +++ b/isotpserver.c
> @@ -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");
> diff --git a/isotpsniffer.c b/isotpsniffer.c
> index 7618dca549a0..9182fcc240b6 100644
> --- a/isotpsniffer.c
> +++ b/isotpsniffer.c
> @@ -271,9 +271,14 @@ int main(int argc, char **argv)
>  
>  	opts.flags |= CAN_ISOTP_LISTEN_MODE;
>  
> +	strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
> +	ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
> +	if (!ifr.ifr_ifindex) {
> +		perror("if_nametoindex");
> +		return 1;
> +	}
> +

Here too.

>  	addr.can_family = AF_CAN;
> -	strcpy(ifr.ifr_name, argv[optind]);
> -	ioctl(s, SIOCGIFINDEX, &ifr);
>  	addr.can_ifindex = ifr.ifr_ifindex;
>  
>  	setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
> diff --git a/isotptun.c b/isotptun.c
> index c793f42015fb..400e1b74e8bd 100644
> --- a/isotptun.c
> +++ b/isotptun.c
> @@ -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);

Here too.

> +	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) {
> diff --git a/slcanpty.c b/slcanpty.c
> index f485ac775a53..5cf14ef98374 100644
> --- a/slcanpty.c
> +++ b/slcanpty.c
> @@ -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);
> 

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] treewide: use if_nametoindex to avoid overflows
@ 2015-06-25  7:24 Marc Kleine-Budde
  2015-06-25  7:28 ` Marc Kleine-Budde
  0 siblings, 1 reply; 4+ messages in thread
From: Marc Kleine-Budde @ 2015-06-25  7:24 UTC (permalink / raw)
  To: linux-can; +Cc: Sven Schmitt, Marc Kleine-Budde

From: Sven Schmitt <sven.schmitt@gmx.net>

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>
---
I got a S-o-b meanwhile:

https://github.com/linux-can/can-utils/pull/4

Marc

 canfdtest.c    |  5 +----
 cansend.c      | 11 ++++++-----
 isotpdump.c    |  8 +-------
 isotprecv.c    |  5 +----
 isotpsend.c    |  5 +----
 isotpserver.c  |  8 +-------
 isotpsniffer.c |  9 +++++++--
 isotptun.c     | 10 ++++++++--
 slcanpty.c     |  9 +--------
 9 files changed, 27 insertions(+), 43 deletions(-)

diff --git a/canfdtest.c b/canfdtest.c
index 28b204263aaa..24070278109f 100644
--- a/canfdtest.c
+++ b/canfdtest.c
@@ -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");
diff --git a/cansend.c b/cansend.c
index aec64a5c9e61..a0b9bbbfb25d 100644
--- a/cansend.c
+++ b/cansend.c
@@ -94,13 +94,14 @@ 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);
+	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) {
diff --git a/isotpdump.c b/isotpdump.c
index 6e64eefba5d4..b2b650aa7996 100644
--- a/isotpdump.c
+++ b/isotpdump.c
@@ -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");
diff --git a/isotprecv.c b/isotprecv.c
index 5c4f2a5f11ce..763da39315ef 100644
--- a/isotprecv.c
+++ b/isotprecv.c
@@ -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");
diff --git a/isotpsend.c b/isotpsend.c
index e0256cb9083e..b6a56708fb4d 100644
--- a/isotpsend.c
+++ b/isotpsend.c
@@ -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");
diff --git a/isotpserver.c b/isotpserver.c
index b900f279b01d..7c0c1eeb5aa2 100644
--- a/isotpserver.c
+++ b/isotpserver.c
@@ -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");
diff --git a/isotpsniffer.c b/isotpsniffer.c
index 7618dca549a0..9182fcc240b6 100644
--- a/isotpsniffer.c
+++ b/isotpsniffer.c
@@ -271,9 +271,14 @@ int main(int argc, char **argv)
 
 	opts.flags |= CAN_ISOTP_LISTEN_MODE;
 
+	strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
+	ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name);
+	if (!ifr.ifr_ifindex) {
+		perror("if_nametoindex");
+		return 1;
+	}
+
 	addr.can_family = AF_CAN;
-	strcpy(ifr.ifr_name, argv[optind]);
-	ioctl(s, SIOCGIFINDEX, &ifr);
 	addr.can_ifindex = ifr.ifr_ifindex;
 
 	setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
diff --git a/isotptun.c b/isotptun.c
index c793f42015fb..400e1b74e8bd 100644
--- a/isotptun.c
+++ b/isotptun.c
@@ -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) {
diff --git a/slcanpty.c b/slcanpty.c
index f485ac775a53..5cf14ef98374 100644
--- a/slcanpty.c
+++ b/slcanpty.c
@@ -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);
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-06-25  7:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-24 18:22 [PATCH] treewide: use if_nametoindex to avoid overflows Marc Kleine-Budde
2015-06-24 18:25 ` Marc Kleine-Budde
2015-06-25  7:24 Marc Kleine-Budde
2015-06-25  7:28 ` Marc Kleine-Budde

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.