summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authortuexen <tuexen@FreeBSD.org>2015-06-22 05:36:08 +0000
committertuexen <tuexen@FreeBSD.org>2015-06-22 05:36:08 +0000
commit167ded8010f12b788bbad18d88bc9ace1d9882dc (patch)
tree8a8475c7ae0eda19a72c54a0721bea1059651171 /usr.bin
parentb52cec9e004cf987627b2d6d72032b0461a8f963 (diff)
downloadFreeBSD-src-167ded8010f12b788bbad18d88bc9ace1d9882dc.zip
FreeBSD-src-167ded8010f12b788bbad18d88bc9ace1d9882dc.tar.gz
MFC r284604:
Don't leak sockets. Reported by: Coverity CID: 1306785
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/sockstat/sockstat.c52
1 files changed, 39 insertions, 13 deletions
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 1299f97..991b074 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -255,6 +255,26 @@ sockaddr(struct sockaddr_storage *sa, int af, void *addr, int port)
}
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);
OpenPOWER on IntegriCloud