Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Apr 1997 00:32:36 -0600 (MDT)
From:      Marc Slemko <marcs@znep.com>
To:        hackers@freebsd.org
Subject:   source address for ping causes crash?
Message-ID:  <Pine.BSF.3.95.970417002625.12316G-100000@alive.znep.com>

next in thread | raw e-mail | index | archive | help
I was testing a copy of ping with the following changes to allow you to
specify the local address with the -S option.  Appeared to be working fine
(and is, in some situations, a very useful thing to have) but then the box
I was testing it on rebooted itself.  Was not near the console so I don't
know if it paniced or just rebooted.

Any reason what I'm trying shouldn't work?  There are around 75 alias
interfaces on lo0 on that box which is running 2.2 from a couple of weeks
ago.  Don't have time to track the cause (or run it on a box I'm sitting
in front of) now, but if no one has any suggestions I will look into it
when I get a chance. 

Index: ping.c
===================================================================
RCS file: /usr/cvs/src/sbin/ping/ping.c,v
retrieving revision 1.8.2.8
diff -c -r1.8.2.8 ping.c
*** ping.c	1997/03/03 09:44:16	1.8.2.8
--- ping.c	1997/04/17 06:25:08
***************
*** 121,126 ****
--- 121,127 ----
  char rcvd_tbl[MAX_DUP_CHK / 8];
  
  struct sockaddr whereto;	/* who to ping */
+ struct sockaddr_in *wherefrom;	/* source address */
  int datalen = DEFDATALEN;
  int s;				/* socket file descriptor */
  u_char outpack[MAXPACKET];
***************
*** 184,190 ****
  	preload = 0;
  
  	datap = &outpack[8 + sizeof(struct timeval)];
! 	while ((ch = getopt(argc, argv, "I:LQRT:c:adfi:l:np:qrs:v")) != -1)
  		switch(ch) {
  		case 'a':
  			options |= F_AUDIBLE;
--- 185,191 ----
  	preload = 0;
  
  	datap = &outpack[8 + sizeof(struct timeval)];
! 	while ((ch = getopt(argc, argv, "I:LQRS:T:c:adfi:l:np:qrs:v")) != -1)
  		switch(ch) {
  		case 'a':
  			options |= F_AUDIBLE;
***************
*** 276,281 ****
--- 277,302 ----
  				exit(1);
  			}
  			break;
+ 		case 'S':		/* source address */
+ 			wherefrom = (struct sockaddr_in *)
+ 				calloc(1, sizeof(struct sockaddr_in));
+ 			wherefrom->sin_family = AF_INET;
+ 			wherefrom->sin_len = sizeof(struct sockaddr_in);
+ 			wherefrom->sin_port = htons(INADDR_ANY); 
+ 			wherefrom->sin_addr.s_addr = inet_addr(optarg);
+ 			if (wherefrom->sin_addr.s_addr == (u_int)-1) {
+ 				hp = gethostbyname(optarg);
+ 				if (!hp) {
+ 					(void)fprintf(stderr,
+ 					    "ping: unknown host %s\n", optarg);
+ 					exit(1);
+ 				}
+ 				wherefrom->sin_family = hp->h_addrtype;
+ 				if (hp->h_length > sizeof(wherefrom->sin_addr))
+ 					errx(1,"gethostbyname returned an illegal address");
+ 				bcopy(hp->h_addr, (caddr_t)&wherefrom->sin_addr.s_addr, hp->h_length);
+ 			}
+ 			break;
  		case 'T':		/* multicast TTL */
  			i = atoi(optarg);
  			if (i < 0 || i > 255) {
***************
*** 522,527 ****
--- 543,551 ----
  
  	/* compute ICMP checksum here */
  	icp->icmp_cksum = in_cksum((u_short *)icp, cc);
+ 
+ 	if (wherefrom && bind(s, (struct sockaddr *)wherefrom, sizeof(struct sockaddr_in)))
+ 		err(1, "bind (source address)");
  
  	i = sendto(s, (char *)outpack, cc, 0, &whereto,
  	    sizeof(struct sockaddr));




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95.970417002625.12316G-100000>