Subject: bin/1180: "netstat" displays wrong IP network address
To: None <gnats-admin@sun-lamp.pc.cs.cmu.edu>
From: None <taka@fxis.fujixerox.co.jp>
List: netbsd-bugs
Date: 07/01/1995 03:05:14
>Number:         1180
>Category:       bin
>Synopsis:       "netstat -i" displays wrong IP network address
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Jul  1 03:05:08 1995
>Originator:     Takahiro Kanbe
>Organization:
	Fuji Xerox Information Systems Co., Ltd.
>Release:        6/24/1995 -current
>Environment:
System: NetBSD roadsky.nwt.fxis.fujixerox.co.jp 1.0A NetBSD 1.0A (ROADSKY) #3: Mon Jun 26 00:42:32 JST 1995 taka@roadsky.nwt.fxis.fujixerox.co.jp:/usr/src/sys/arch/i386/compile/ROADSKY i386


>Description:
	"Netstat -i" displays wrong IP network address; incorrect
	byte order.  This may happen on little endian systems.
	
>How-To-Repeat:
	% netstat -i
>Fix:
	There are two problems.

	1. intpr() in if.c calls netname() twice, and latter calls 
	   extra htonl() for netnames() argument.

	2. netname() in route.c expect network order IP address and
	   netmask.  But it's ignore netmasks's byte order.

*** if.c.ORIG	Tue Jun 20 19:52:30 1995
--- if.c	Thu Jun 29 23:26:54 1995
***************
*** 152,159 ****
  				    ifaddr.in.ia_subnetmask));
  #else
  				printf("%-11.11s ",
! 				    netname(htonl(ifaddr.in.ia_subnet),
! 				    ifaddr.in.ia_subnetmask));
  #endif
  				printf("%-15.15s ",
  				    routename(sin->sin_addr.s_addr));
--- 152,159 ----
  				    ifaddr.in.ia_subnetmask));
  #else
  				printf("%-11.11s ",
! 				    netname(ifaddr.in.ia_subnet,
! 					    ifaddr.in.ia_subnetmask));
  #endif
  				printf("%-15.15s ",
  				    routename(sin->sin_addr.s_addr));
*** route.c.ORIG	Wed Mar 29 20:15:43 1995
--- route.c	Thu Jun 29 23:42:46 1995
***************
*** 514,520 ****
  	static char line[MAXHOSTNAMELEN + 1];
  	struct netent *np = 0;
  	u_long net;
! 	register int i;
  	int subnetshift;
  
  	i = ntohl(in);
--- 514,520 ----
  	static char line[MAXHOSTNAMELEN + 1];
  	struct netent *np = 0;
  	u_long net;
! 	register u_long i;
  	int subnetshift;
  
  	i = ntohl(in);
***************
*** 538,543 ****
--- 538,545 ----
  			 */
  			while (i &~ mask)
  				mask = (long)mask >> subnetshift;
+ 		} else {
+ 			mask = ntohl(mask);
  		}
  		net = i & mask;
  		while ((mask & 1) == 0)
>Audit-Trail:
>Unformatted: