diff options
author | wollman <wollman@FreeBSD.org> | 1997-08-16 19:16:27 +0000 |
---|---|---|
committer | wollman <wollman@FreeBSD.org> | 1997-08-16 19:16:27 +0000 |
commit | 4542c1cf5d7077caf33d6d9468f5e647cd9d19e5 (patch) | |
tree | 69fd093ef1e8c080592999507b664fe6315c0e10 /sys/kern/uipc_socket.c | |
parent | f4edc7fc6748272644fb845fc8636a5c261247d6 (diff) | |
download | FreeBSD-src-4542c1cf5d7077caf33d6d9468f5e647cd9d19e5.zip FreeBSD-src-4542c1cf5d7077caf33d6d9468f5e647cd9d19e5.tar.gz |
Fix all areas of the system (or at least all those in LINT) to avoid storing
socket addresses in mbufs. (Socket buffers are the one exception.) A number
of kernel APIs needed to get fixed in order to make this happen. Also,
fix three protocol families which kept PCBs in mbufs to not malloc them
instead. Delete some old compatibility cruft while we're at it, and add
some new routines in the in_cksum family.
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r-- | sys/kern/uipc_socket.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 8c1319a..8a554d0 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 - * $Id: uipc_socket.c,v 1.26 1997/04/27 20:00:44 wollman Exp $ + * $Id: uipc_socket.c,v 1.27 1997/06/27 15:28:54 peter Exp $ */ #include <sys/param.h> @@ -101,7 +101,7 @@ socreate(dom, aso, type, proto, p) int sobind(so, nam, p) struct socket *so; - struct mbuf *nam; + struct sockaddr *nam; struct proc *p; { int s = splnet(); @@ -233,7 +233,7 @@ soabort(so) int soaccept(so, nam) register struct socket *so; - struct mbuf *nam; + struct sockaddr **nam; { int s = splnet(); int error; @@ -249,7 +249,7 @@ soaccept(so, nam) int soconnect(so, nam, p) register struct socket *so; - struct mbuf *nam; + struct sockaddr *nam; struct proc *p; { int s; @@ -327,15 +327,15 @@ bad: * Data and control buffers are freed on return. */ int -sosend(so, addr, uio, top, control, flags) +sosend(so, addr, uio, top, control, flags, p) register struct socket *so; - struct mbuf *addr; + struct sockaddr *addr; struct uio *uio; struct mbuf *top; struct mbuf *control; int flags; + struct proc *p; { - struct proc *p = curproc; /* XXX */ struct mbuf **mp; register struct mbuf *m; register long space, len, resid; @@ -512,9 +512,9 @@ out: * only for the count in uio_resid. */ int -soreceive(so, paddr, uio, mp0, controlp, flagsp) +soreceive(so, psa, uio, mp0, controlp, flagsp) register struct socket *so; - struct mbuf **paddr; + struct sockaddr **psa; struct uio *uio; struct mbuf **mp0; struct mbuf **controlp; @@ -528,8 +528,8 @@ soreceive(so, paddr, uio, mp0, controlp, flagsp) int orig_resid = uio->uio_resid; mp = mp0; - if (paddr) - *paddr = 0; + if (psa) + *psa = 0; if (controlp) *controlp = 0; if (flagsp) @@ -630,21 +630,15 @@ dontblock: panic("receive 1a"); #endif orig_resid = 0; + if (psa) + *psa = dup_sockaddr(mtod(m, struct sockaddr *), + mp0 == 0); if (flags & MSG_PEEK) { - if (paddr) - *paddr = m_copy(m, 0, m->m_len); m = m->m_next; } else { sbfree(&so->so_rcv, m); - if (paddr) { - *paddr = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } + MFREE(m, so->so_rcv.sb_mb); + m = so->so_rcv.sb_mb; } } while (m && m->m_type == MT_CONTROL && error == 0) { |