Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/raw_ip.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/raw_ip.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.146.2.4 retrieving revision 1.149 diff -u -p -r1.146.2.4 -r1.149 --- src/sys/netinet/raw_ip.c 2016/03/19 11:30:33 1.146.2.4 +++ src/sys/netinet/raw_ip.c 2015/04/25 15:19:54 1.149 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.146.2.4 2016/03/19 11:30:33 skrll Exp $ */ +/* $NetBSD: raw_ip.c,v 1.149 2015/04/25 15:19:54 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,14 +65,12 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.146.2.4 2016/03/19 11:30:33 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.149 2015/04/25 15:19:54 rtr Exp $"); -#ifdef _KERNEL_OPT #include "opt_inet.h" #include "opt_compat_netbsd.h" #include "opt_ipsec.h" #include "opt_mrouting.h" -#endif #include #include @@ -148,7 +146,7 @@ rip_sbappendaddr(struct inpcb *last, str { if (last->inp_flags & INP_NOHEADER) m_adj(n, hlen); - if (last->inp_flags & INP_CONTROLOPTS + if (last->inp_flags & INP_CONTROLOPTS #ifdef SO_OTIMESTAMP || last->inp_socket->so_options & SO_OTIMESTAMP #endif @@ -311,11 +309,17 @@ rip_ctlinput(int cmd, const struct socka * Tack on options user may have setup with control call. */ int -rip_output(struct mbuf *m, struct inpcb *inp) +rip_output(struct mbuf *m, ...) { + struct inpcb *inp; struct ip *ip; struct mbuf *opts; int flags; + va_list ap; + + va_start(ap, m); + inp = va_arg(ap, struct inpcb *); + va_end(ap); flags = (inp->inp_socket->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST @@ -556,7 +560,6 @@ rip_bind(struct socket *so, struct socka struct sockaddr_in *addr = (struct sockaddr_in *)nam; int error = 0; int s; - struct ifaddr *ia; KASSERT(solocked(so)); KASSERT(inp != NULL); @@ -574,19 +577,11 @@ rip_bind(struct socket *so, struct socka error = EAFNOSUPPORT; goto release; } - if ((ia = ifa_ifwithaddr(sintosa(addr))) == 0 && - !in_nullhost(addr->sin_addr)) - { + if (!in_nullhost(addr->sin_addr) && + ifa_ifwithaddr(sintosa(addr)) == 0) { error = EADDRNOTAVAIL; goto release; } - if (ia && ((struct in_ifaddr *)ia)->ia4_flags & - (IN6_IFF_NOTREADY | IN_IFF_DETACHED)) - { - error = EADDRNOTAVAIL; - goto release; - } - inp->inp_laddr = addr->sin_addr; release: @@ -603,7 +598,7 @@ rip_listen(struct socket *so, struct lwp } static int -rip_connect(struct socket *so, struct sockaddr *nam, struct lwp *l) +rip_connect(struct socket *so, struct mbuf *nam, struct lwp *l) { struct inpcb *inp = sotoinpcb(so); int error = 0; @@ -614,7 +609,9 @@ rip_connect(struct socket *so, struct so KASSERT(nam != NULL); s = splsoftnet(); - error = rip_connect_pcb(inp, (struct sockaddr_in *)nam); + if (nam->m_len != sizeof(struct sockaddr_in)) + return EINVAL; + error = rip_connect_pcb(inp, mtod(nam, struct sockaddr_in *)); if (! error) soisconnected(so); splx(s); @@ -738,7 +735,7 @@ rip_recvoob(struct socket *so, struct mb } static int -rip_send(struct socket *so, struct mbuf *m, struct sockaddr *nam, +rip_send(struct socket *so, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { struct inpcb *inp = sotoinpcb(so); @@ -765,7 +762,9 @@ rip_send(struct socket *so, struct mbuf error = EISCONN; goto die; } - error = rip_connect_pcb(inp, (struct sockaddr_in *)nam); + if (nam->m_len != sizeof(struct sockaddr_in)) + return EINVAL; + error = rip_connect_pcb(inp, mtod(nam, struct sockaddr_in *)); if (error) { die: m_freem(m); @@ -813,6 +812,40 @@ rip_purgeif(struct socket *so, struct if return 0; } +int +rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, + struct mbuf *control, struct lwp *l) +{ + KASSERT(req != PRU_ATTACH); + KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); + KASSERT(req != PRU_BIND); + KASSERT(req != PRU_LISTEN); + KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); + KASSERT(req != PRU_CONTROL); + KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); + KASSERT(req != PRU_RCVD); + KASSERT(req != PRU_RCVOOB); + KASSERT(req != PRU_SEND); + KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); + + KASSERT(solocked(so)); + + if (sotoinpcb(so) == NULL) + return EINVAL; + + panic("rip_usrreq"); + + return 0; +} + PR_WRAP_USRREQS(rip) #define rip_attach rip_attach_wrapper #define rip_detach rip_detach_wrapper @@ -833,6 +866,7 @@ PR_WRAP_USRREQS(rip) #define rip_send rip_send_wrapper #define rip_sendoob rip_sendoob_wrapper #define rip_purgeif rip_purgeif_wrapper +#define rip_usrreq rip_usrreq_wrapper const struct pr_usrreqs rip_usrreqs = { .pr_attach = rip_attach, @@ -854,6 +888,7 @@ const struct pr_usrreqs rip_usrreqs = { .pr_send = rip_send, .pr_sendoob = rip_sendoob, .pr_purgeif = rip_purgeif, + .pr_generic = rip_usrreq, }; static void