svn commit: r284604 - head/usr.bin/sockstat
Michael Tuexen
tuexen at FreeBSD.org
Fri Jun 19 19:36:30 UTC 2015
Author: tuexen
Date: Fri Jun 19 19:36:29 2015
New Revision: 284604
URL: https://svnweb.freebsd.org/changeset/base/284604
Log:
Don't leak sockets.
Reported by: Coverity
CID: 1306785
MFC after: 3 days
Modified:
head/usr.bin/sockstat/sockstat.c
Modified: head/usr.bin/sockstat/sockstat.c
==============================================================================
--- head/usr.bin/sockstat/sockstat.c Fri Jun 19 19:36:21 2015 (r284603)
+++ head/usr.bin/sockstat/sockstat.c Fri Jun 19 19:36:29 2015 (r284604)
@@ -255,6 +255,26 @@ sockaddr(struct sockaddr_storage *sa, in
}
static void
+free_socket(struct sock *sock)
+{
+ struct addr *cur, *next;
+
+ cur = sock->laddr;
+ while (cur != NULL) {
+ next = cur->next;
+ free(cur);
+ cur = next;
+ }
+ cur = sock->faddr;
+ while (cur != NULL) {
+ next = cur->next;
+ free(cur);
+ cur = next;
+ }
+ free(sock);
+}
+
+static void
gather_sctp(void)
{
struct sock *sock;
@@ -366,14 +386,17 @@ gather_sctp(void)
while (offset < len) {
xstcb = (struct xsctp_tcb *)(void *)(buf + offset);
offset += sizeof(struct xsctp_tcb);
- if (no_stcb &&
- opt_l &&
- (!opt_L || !local_all_loopback) &&
- ((xinpcb->flags & SCTP_PCB_FLAGS_UDPTYPE) ||
- (xstcb->last == 1))) {
- hash = (int)((uintptr_t)sock->socket % HASHSIZE);
- sock->next = sockhash[hash];
- sockhash[hash] = sock;
+ if (no_stcb) {
+ if (opt_l &&
+ (!opt_L || !local_all_loopback) &&
+ ((xinpcb->flags & SCTP_PCB_FLAGS_UDPTYPE) ||
+ (xstcb->last == 1))) {
+ hash = (int)((uintptr_t)sock->socket % HASHSIZE);
+ sock->next = sockhash[hash];
+ sockhash[hash] = sock;
+ } else {
+ free_socket(sock);
+ }
}
if (xstcb->last == 1)
break;
@@ -476,11 +499,14 @@ gather_sctp(void)
prev_faddr->next = faddr;
prev_faddr = faddr;
}
- if (opt_c &&
- (!opt_L || !(local_all_loopback || foreign_all_loopback))) {
- hash = (int)((uintptr_t)sock->socket % HASHSIZE);
- sock->next = sockhash[hash];
- sockhash[hash] = sock;
+ if (opt_c) {
+ if (!opt_L || !(local_all_loopback || foreign_all_loopback)) {
+ hash = (int)((uintptr_t)sock->socket % HASHSIZE);
+ sock->next = sockhash[hash];
+ sockhash[hash] = sock;
+ } else {
+ free_socket(sock);
+ }
}
}
xinpcb = (struct xsctp_inpcb *)(void *)(buf + offset);
More information about the svn-src-all
mailing list