I'm trying to plug some of the holes not checking for mbuf shortage.

In particular, there are the following unchecked calls to MGET and
friends in /sys/kern/uipc_socket.c:sosend() (see patches below).

Would anyone mind if I commit these? I won't be able to commit
these before next Sunday evening, so if anyone deems these to be
useful, he's welcome to commit before then.

Another big problem is that there's a check in m_retry and friends
that panics when falling short of mbufs! I really believe this does
more harm than good, because it prevents correct calling code
(checking for NULL mbuf pointers) from exiting gracefully with
ENOBUFS...

These could most certainly help with 3.2-RELEASE too. Same problem,
I won't be able to do anything more before Sunday.

--- uipc_socket.c.orig  Wed May  5 16:48:57 1999
+++ uipc_socket.c       Wed May 12 16:55:27 1999
@@ -497,15 +497,27 @@
                    } else do {
                        if (top == 0) {
                                MGETHDR(m, M_WAIT, MT_DATA);
+                               if (m == 0) {
+                                   error = ENOBUFS;
+                                   goto release;
+                               }
                                mlen = MHLEN;
                                m->m_pkthdr.len = 0;
                                m->m_pkthdr.rcvif = (struct ifnet *)0;
                        } else {
                                MGET(m, M_WAIT, MT_DATA);
+                               if (m == 0) {
+                                   error = ENOBUFS;
+                                   goto release;
+                               }
                                mlen = MLEN;
                        }
                        if (resid >= MINCLSIZE) {
                                MCLGET(m, M_WAIT);
+                               if (m == 0) {
+                                   error = ENOBUFS;
+                                   goto release;
+                               }
                                if ((m->m_flags & M_EXT) == 0)
                                        goto nopages;
                                mlen = MCLBYTES;
@@ -617,6 +629,8 @@
                flags = 0;
        if (flags & MSG_OOB) {
                m = m_get(M_WAIT, MT_DATA);
+               if (m == 0)
+                       return (ENOBUFS);
                error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK);
                if (error)
                        goto bad;

--- uipc_mbuf.c.orig    Fri Apr 30 12:33:50 1999
+++ uipc_mbuf.c Wed May 12 17:05:02 1999
@@ -263,10 +263,7 @@
        if (m != NULL) {
                mbstat.m_wait++;
        } else {
-               if (i == M_DONTWAIT)
-                       mbstat.m_drops++;
-               else
-                       panic("Out of mbuf clusters");
+               mbstat.m_drops++;
        }
        return (m);
 }
@@ -291,10 +288,7 @@
        if (m != NULL) {
                mbstat.m_wait++;
        } else {
-               if (i == M_DONTWAIT)
-                       mbstat.m_drops++;
-               else
-                       panic("Out of mbuf clusters");
+               mbstat.m_drops++;
        }
        return (m);
 }
-- 
Pierre Beyssac          p...@enst.fr


To Unsubscribe: send mail to majord...@freebsd.org
with "unsubscribe freebsd-current" in the body of the message

Reply via email to