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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to