Do not display bogus entries for sockets in the TIME_WAIT or similar

states that no longer have a corresponding file descriptor - until now,
sockstat would mostly randomly match null kern.file.*.xf_data fields
with the first mostly-closed socket.

This bugfix is a RELENG_5 candidate.

Approved by:	andre
This commit is contained in:
Peter Pentchev 2004-08-25 16:36:17 +00:00
parent be460b9467
commit 97c6143c95
2 changed files with 18 additions and 1 deletions

View File

@ -27,7 +27,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd August 7, 2001 .Dd August 25, 2004
.Dt SOCKSTAT 1 .Dt SOCKSTAT 1
.Os .Os
.Sh NAME .Sh NAME
@ -121,6 +121,21 @@ if the endpoint could not be determined.
The address the foreign end of the socket is bound to (see The address the foreign end of the socket is bound to (see
.Xr getpeername 2 ) . .Xr getpeername 2 ) .
.El .El
.Pp
Note that TCP sockets in the
.Dv AF_INET
or
.Dv AF_INET6
domains that are not in one of the
.Dv LISTEN ,
.Dv SYN_SENT ,
or
.Dv ESTABLISHED
states may not be shown by
.Nm ;
use
.Xr netstat 1
to examine them instead.
.Sh SEE ALSO .Sh SEE ALSO
.Xr fstat 1 , .Xr fstat 1 ,
.Xr netstat 1 , .Xr netstat 1 ,

View File

@ -494,6 +494,8 @@ display(void)
"LOCAL ADDRESS", "FOREIGN ADDRESS"); "LOCAL ADDRESS", "FOREIGN ADDRESS");
setpassent(1); setpassent(1);
for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) { for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
if (xf->xf_data == NULL)
continue;
hash = (int)((uintptr_t)xf->xf_data % HASHSIZE); hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
for (s = sockhash[hash]; s != NULL; s = s->next) for (s = sockhash[hash]; s != NULL; s = s->next)
if ((void *)s->socket == xf->xf_data) if ((void *)s->socket == xf->xf_data)