There is no way SS_NOFDREF is set on a raw socket in raw_usrreq for
PRU_DISCONNECT or PRU_ABORT.

So raw_disconnect() and sofree() return immediately so remove the dead
code.
Also the following call to soisdisconnected() would be a
use after free.

This removes the last calls to raw_disconnect() so tedu it.

OK?

diff --git sys/net/raw_cb.c sys/net/raw_cb.c
index 107ccc37964..f2396c704dd 100644
--- sys/net/raw_cb.c
+++ sys/net/raw_cb.c
@@ -104,13 +104,3 @@ raw_do_detach(struct rawcb *rp)
        sofree(so);
        free((caddr_t)(rp), M_PCB, 0);
 }
-
-/*
- * Disconnect and possibly release resources.
- */
-void
-raw_disconnect(struct rawcb *rp)
-{
-       if (rp->rcb_socket->so_state & SS_NOFDREF)
-               raw_do_detach(rp);
-}
diff --git sys/net/raw_cb.h sys/net/raw_cb.h
index aba508b1c96..f284b56044f 100644
--- sys/net/raw_cb.h
+++ sys/net/raw_cb.h
@@ -58,7 +58,6 @@ struct rawcb {
 int     raw_attach(struct socket *, int);
 int     raw_detach(struct socket *);
 void    raw_do_detach(struct rawcb *);
-void    raw_disconnect(struct rawcb *);
 void    raw_init(void);
 int     raw_usrreq(struct socket *,
            int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
diff --git sys/net/raw_usrreq.c sys/net/raw_usrreq.c
index 5f1d1c43479..462fcbbc221 100644
--- sys/net/raw_usrreq.c
+++ sys/net/raw_usrreq.c
@@ -78,7 +78,6 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct 
mbuf *nam,
                        error = ENOTCONN;
                        break;
                }
-               raw_disconnect(rp);
                soisdisconnected(so);
                break;
 
@@ -111,8 +110,6 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, 
struct mbuf *nam,
                break;
 
        case PRU_ABORT:
-               raw_disconnect(rp);
-               sofree(so);
                soisdisconnected(so);
                break;
 


-- 
I'm not entirely sure you are real.

Reply via email to