--- misc/ss.c 2009-10-09 14:26:41.000000000 +0200 +++ misc/ss.c 2009-10-09 14:30:00.000000000 +0200 @@ -464,6 +464,7 @@ } } } + pclose (fp); } } --- misc/ss.c 2009-10-09 14:39:14.000000000 +0200 +++ misc/ss.c 2009-10-09 14:40:25.000000000 +0200 @@ -1571,10 +1571,12 @@ status = fread(buf, 1, sizeof(*h), fp); if (status < 0) { perror("Reading header from $TCPDIAG_FILE"); + fclose (fp); return -1; } if (status != sizeof(*h)) { perror("Unexpected EOF reading $TCPDIAG_FILE"); + fclose (fp); return -1; } @@ -1582,16 +1584,20 @@ if (status < 0) { perror("Reading $TCPDIAG_FILE"); + fclose (fp); return -1; } if (status + sizeof(*h) < h->nlmsg_len) { perror("Unexpected EOF reading $TCPDIAG_FILE"); + fclose (fp); return -1; } /* The only legal exit point */ - if (h->nlmsg_type == NLMSG_DONE) + if (h->nlmsg_type == NLMSG_DONE) { + fclose (fp); return 0; + } if (h->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h); @@ -1601,13 +1607,17 @@ errno = -err->error; perror("TCPDIAG answered"); } + fclose (fp); return -1; } err = tcp_show_sock(h, f); - if (err < 0) + if (err < 0) { + fclose (fp); return err; + } } + fclose (fp); } static int tcp_show(struct filter *f, int socktype)