Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jul 2001 12:39:52 -0700 (PDT)
From:      pherman@frenchfries.net
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   alpha/29231: sockstat broken on alpha [patch]
Message-ID:  <200107251939.f6PJdqX06597@tick.sc.omation.com>

next in thread | raw e-mail | index | archive | help

>Number:         29231
>Category:       alpha
>Synopsis:       sockstat broken on alpha [patch]
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-alpha
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jul 25 12:40:07 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Paul Herman <pherman@frenchfries.net>
>Release:        FreeBSD 4.3-RELEASE alpha
>Organization:
>Environment:
System: FreeBSD tick.sc.omation.com 4.3-RELEASE FreeBSD 4.3-RELEASE #0: Tue Jun 5 12:34:59 PDT 2001 root@fw1.sc.omation.com:/usr/src/sys/compile/fw1 alpha


	
>Description:

   sockstat prints only "?" for protocols & addresses when run on
   a 64-bit OS.

>How-To-Repeat:

  12:32:05{{ttyp0}pherman@arthur}~//> sockstat | head
  USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS 
  root     xterm    32538    3 ?      ?                     ?               
  root     sshd     32537    3 ?      ?                     ?               
  root     sshd     32537    4 ?      ?                     ?                
  root     sshd     32537    6 ?      ?                     ?               
  bind     named    28544    4 ?      ?                     ?               

>Fix:

   The reason is because the socket addresses printed by "netstat -A"
   are 64-bit u_long on a 64-bit platform.  fstat, however, prints them
   as ints which are always 32-bit.  A second problem is that
   sockstat.pl is hardcoded to expect only 8-byte socket addresses.

   The following patch for -STABLE fixes this issue:

Index: usr.bin/fstat/fstat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/fstat/fstat.c,v
retrieving revision 1.21.2.3
diff -u -r1.21.2.3 fstat.c
--- usr.bin/fstat/fstat.c	2000/12/05 09:43:11	1.21.2.3
+++ usr.bin/fstat/fstat.c	2001/07/25 18:04:22
@@ -664,7 +664,7 @@
 		goto bad;
 	}
 
-	printf("* pipe %8x <-> %8x", (int)pi, (int)pip.pipe_peer);
+	printf("* pipe %8lx <-> %8lx", (u_long)pi, (u_long)pip.pipe_peer);
 	printf(" %6d", (int)pip.pipe_buffer.cnt);
 	rw[0] = '\0';
 	if (flag & FREAD)
@@ -762,16 +762,16 @@
 					    (void *)so.so_pcb);
 					goto bad;
 				}
-				printf(" %x", (int)inpcb.inp_ppcb);
+				printf(" %lx", (u_long)inpcb.inp_ppcb);
 			}
 		}
 		else if (so.so_pcb)
-			printf(" %x", (int)so.so_pcb);
+			printf(" %lx", (u_long)so.so_pcb);
 		break;
 	case AF_UNIX:
 		/* print address of pcb and connected pcb */
 		if (so.so_pcb) {
-			printf(" %x", (int)so.so_pcb);
+			printf(" %lx", (u_long)so.so_pcb);
 			if (kvm_read(kd, (u_long)so.so_pcb, (char *)&unpcb,
 			    sizeof(struct unpcb)) != sizeof(struct unpcb)){
 				dprintf(stderr, "can't read unpcb at %p\n",
@@ -788,14 +788,14 @@
 				if (!(so.so_state & SS_CANTSENDMORE))
 					*cp++ = '>';
 				*cp = '\0';
-				printf(" %s %x", shoconn,
-				    (int)unpcb.unp_conn);
+				printf(" %s %lx", shoconn,
+				    (u_long)unpcb.unp_conn);
 			}
 		}
 		break;
 	default:
 		/* print protocol number and socket address */
-		printf(" %d %x", proto.pr_protocol, (int)sock);
+		printf(" %d %lx", proto.pr_protocol, (u_long)sock);
 	}
 	printf("\n");
 	return;
Index: usr.bin/sockstat/sockstat.pl
===================================================================
RCS file: /home/ncvs/src/usr.bin/sockstat/sockstat.pl,v
retrieving revision 1.6.2.4
diff -u -r1.6.2.4 sockstat.pl
--- usr.bin/sockstat/sockstat.pl	2001/03/22 13:49:51	1.6.2.4
+++ usr.bin/sockstat/sockstat.pl	2001/07/25 19:15:26
@@ -57,7 +57,7 @@
 	die("exec(netstat): $!\n");
     }
     while ($line = <PIPE>) {
-	next unless ($line =~ m/^[0-9a-f]{8} /);
+	next unless ($line =~ m/^[0-9a-f]{8} /) || ($line =~ m/^[0-9a-f]{16} /);
 	chomp($line);
 	@fields = split(' ', $line);
 	$netstat{$fields[0]} = [ @fields ];
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107251939.f6PJdqX06597>