The implementation of SO_PEERCRED is leaking mbufs.
> netstat -m
5292 mbufs in use:
        46 mbufs allocated to data
        4 mbufs allocated to packet headers
        43 mbufs allocated to socket names and addresses
        5199 mbufs allocated to socket options
and quite a few over some time
> uptime
10:37PM  up 10:25, 12 users, load averages: 0.29, 0.16, 0.10

This diff plugs this leak and stops my laptop from leaking.
-- 
:wq Claudio

Index: uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.89
diff -u -p -r1.89 uipc_socket.c
--- uipc_socket.c       4 Apr 2011 11:10:26 -0000       1.89
+++ uipc_socket.c       4 Apr 2011 20:29:31 -0000
@@ -1567,15 +1573,17 @@ sogetopt(struct socket *so, int level, i
                                struct unpcb *unp = sotounpcb(so);
 
                                if (unp->unp_flags & UNP_FEIDS) {
-                                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
                                        m->m_len = sizeof(unp->unp_connid);
                                        bcopy((caddr_t)(&(unp->unp_connid)),
                                            mtod(m, caddr_t),
-                                           (unsigned)m->m_len);
-                               } else
-                                       return (ENOTCONN);
-                       } else
-                               return (EOPNOTSUPP);
+                                           m->m_len);
+                                       break;
+                               }
+                               (void)m_free(m);
+                               return (ENOTCONN);
+                       }
+                       (void)m_free(m);
+                       return (EOPNOTSUPP);
                        break;
 
                default:

Reply via email to