[CFR] Fix sockstat's handling of closed connections
Andre Oppermann
andre at freebsd.org
Wed Aug 25 08:48:37 PDT 2004
Peter Pentchev wrote:
>
> Hi,
>
> I first came across this a couple of months ago, but today I finally
> took the time to look into it.
>
> Basically, if a program has recently closed a TCP connection or three
> and they are currently in CLOSED or TIME_WAIT state, sockstat(1) will
> report them as active connected sockets and link them to completely
> bogus programs and file descriptors. Here's a demonstration, taken
> immediately after a completed fetchmail poll of three POP3 servers:
This has got me freaked out more than once alreay but I never found
time to look into it. Good catch!
> [roam at straylight ~/fbsd/r/src/usr.bin/sockstat]> sockstat -4c
> USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
> www httpd 5408 3 tcp4 217.75.134.254:58889 217.75.134.1:110
> roam ssh 939 3 tcp4 192.168.11.36:55794 192.168.9.48:22
> www httpd 604 3 tcp4 217.75.134.254:58889 217.75.134.1:110
> nobody dictd 596 26 tcp4 217.75.134.254:58889 217.75.134.1:110
> qmails tcpserver 548 0 tcp4 217.75.134.254:58889 217.75.134.1:110
> [roam at straylight ~/fbsd/r/src/usr.bin/sockstat]> ./sockstat -4c
> USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
> roam ssh 939 3 tcp4 192.168.11.36:55794 192.168.9.48:22
> [roam at straylight ~/fbsd/r/src/usr.bin/sockstat]> netstat -n | egrep '^tcp.*110'
> tcp4 0 0 217.75.134.254.49857 195.24.32.2.110 TIME_WAIT
> tcp4 0 0 217.75.134.254.54159 217.75.128.9.110 TIME_WAIT
> tcp4 0 0 217.75.134.254.58889 217.75.134.1.110 TIME_WAIT
> [roam at straylight ~/fbsd/r/src/usr.bin/sockstat]>
>
> The first 'sockstat' run was the "real" sockstat(1) from FreeBSD
> 5.3-BETA1 as of today; as you can see, it reports the three TIME_WAIT
> sockets as very much active and attributes them to totally unrelated
> processes. I must admit this gave me quite a scare the first time I saw
> this: what in the name of $DEITY are all those servers doing opening
> *outgoing* connections, or, alternatively and even worse, why are they
> listening on high ports?
>
> Luckily, the fix is simple, or at least so it seems to me. It turns out
> that those connections have a xt_socket->xso_so set to NULL, and the
> false positive comes from sockstat's matching them to a similarly NULL
> xf_data members of 'kern.files'. What do people think about the
> following patch? I could commit it if nobody has any objections, but
> being a ports/doc committer, I would need an explicit approval to do
> that :)
The fix looks good to me. It seems small enough so I think I can give
you the direct go-ahead to commit it. Could you also put a comment into
the sockstat man page describing that TCP connections in TIME_WAIT state
can be looked up with netstat?
--
Andre
> G'luck,
> Peter
>
> Index: src/usr.bin/sockstat/sockstat.c
> ===================================================================
> RCS file: /home/ncvs/src/usr.bin/sockstat/sockstat.c,v
> retrieving revision 1.9
> diff -u -r1.9 sockstat.c
> --- src/usr.bin/sockstat/sockstat.c 19 Jul 2003 06:23:56 -0000 1.9
> +++ src/usr.bin/sockstat/sockstat.c 25 Aug 2004 15:14:24 -0000
> @@ -494,6 +494,8 @@
> "LOCAL ADDRESS", "FOREIGN ADDRESS");
> setpassent(1);
> for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
> + if (xf->xf_data == NULL)
> + continue;
> hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
> for (s = sockhash[hash]; s != NULL; s = s->next)
> if ((void *)s->socket == xf->xf_data)
>
> --
> Peter Pentchev roam at ringlet.net roam at cnsys.bg roam at FreeBSD.org
> PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
> Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
> .siht ekil ti gnidaer eb d'uoy ,werbeH ni erew ecnetnes siht fI
>
> --------------------------------------------------------------------------------
> Part 1.2Type: application/pgp-signature
More information about the freebsd-net
mailing list