Index: in_pcb.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/in_pcb.c,v retrieving revision 1.91 diff -u -r1.91 in_pcb.c --- in_pcb.c 2001/10/17 18:07:05 1.91 +++ in_pcb.c 2001/11/05 18:38:04 @@ -175,13 +175,13 @@ int in_pcbbind(inp, nam, td) register struct inpcb *inp; - struct sockaddr *nam; + const struct sockaddr *nam; struct thread *td; { struct proc *p = td->td_proc; register struct socket *so = inp->inp_socket; unsigned short *lastport; - struct sockaddr_in *sin; + struct sockaddr_in sin; struct inpcbinfo *pcbinfo = inp->inp_pcbinfo; u_short lport = 0; int wild = 0, reuseport = (so->so_options & SO_REUSEPORT); @@ -194,22 +194,23 @@ if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0) wild = 1; if (nam) { - sin = (struct sockaddr_in *)nam; - if (nam->sa_len != sizeof (*sin)) + bcopy(nam, &sin, sizeof(sin)); + bzero(&sin.sin_zero, sizeof(sin.sin_zero)); + if (nam->sa_len != sizeof (sin)) return (EINVAL); #ifdef notdef /* * We should check the family, but old programs * incorrectly fail to initialize it. */ - if (sin->sin_family != AF_INET) + if (sin.sin_family != AF_INET) return (EAFNOSUPPORT); #endif - if (sin->sin_addr.s_addr != INADDR_ANY) - if (prison_ip(p->p_ucred, 0, &sin->sin_addr.s_addr)) + if (sin.sin_addr.s_addr != INADDR_ANY) + if (prison_ip(p->p_ucred, 0, &sin.sin_addr.s_addr)) return(EINVAL); - lport = sin->sin_port; - if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + lport = sin.sin_port; + if (IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { /* * Treat SO_REUSEADDR as SO_REUSEPORT for multicast; * allow complete duplication of binding if @@ -219,9 +220,9 @@ */ if (so->so_options & SO_REUSEADDR) reuseport = SO_REUSEADDR|SO_REUSEPORT; - } else if (sin->sin_addr.s_addr != INADDR_ANY) { - sin->sin_port = 0; /* yech... */ - if (ifa_ifwithaddr((struct sockaddr *)sin) == 0) + } else if (sin.sin_addr.s_addr != INADDR_ANY) { + sin.sin_port = 0; + if (ifa_ifwithaddr((struct sockaddr *)&sin) == NULL) return (EADDRNOTAVAIL); } if (lport) { @@ -233,19 +234,19 @@ if (p && jailed(p->p_ucred)) prison = 1; if (so->so_cred->cr_uid != 0 && - !IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + !IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { t = in_pcblookup_local(inp->inp_pcbinfo, - sin->sin_addr, lport, + sin.sin_addr, lport, prison ? 0 : INPLOOKUP_WILDCARD); if (t && - (ntohl(sin->sin_addr.s_addr) != INADDR_ANY || + (ntohl(sin.sin_addr.s_addr) != INADDR_ANY || ntohl(t->inp_laddr.s_addr) != INADDR_ANY || (t->inp_socket->so_options & SO_REUSEPORT) == 0) && (so->so_cred->cr_uid != t->inp_socket->so_cred->cr_uid)) { #if defined(INET6) - if (ntohl(sin->sin_addr.s_addr) != + if (ntohl(sin.sin_addr.s_addr) != INADDR_ANY || ntohl(t->inp_laddr.s_addr) != INADDR_ANY || @@ -256,14 +257,14 @@ } } if (prison && - prison_ip(p->p_ucred, 0, &sin->sin_addr.s_addr)) + prison_ip(p->p_ucred, 0, &sin.sin_addr.s_addr)) return (EADDRNOTAVAIL); - t = in_pcblookup_local(pcbinfo, sin->sin_addr, + t = in_pcblookup_local(pcbinfo, sin.sin_addr, lport, prison ? 0 : wild); if (t && (reuseport & t->inp_socket->so_options) == 0) { #if defined(INET6) - if (ntohl(sin->sin_addr.s_addr) != + if (ntohl(sin.sin_addr.s_addr) != INADDR_ANY || ntohl(t->inp_laddr.s_addr) != INADDR_ANY || @@ -273,7 +274,7 @@ return (EADDRINUSE); } } - inp->inp_laddr = sin->sin_addr; + inp->inp_laddr = sin.sin_addr; } if (lport == 0) { ushort first, last; Index: in_pcb.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/in_pcb.h,v retrieving revision 1.40 diff -u -r1.40 in_pcb.h --- in_pcb.h 2001/09/12 08:37:54 1.40 +++ in_pcb.h 2001/11/05 18:38:05 @@ -279,7 +279,8 @@ void in_losing __P((struct inpcb *)); void in_rtchange __P((struct inpcb *, int)); int in_pcballoc __P((struct socket *, struct inpcbinfo *, struct thread *)); -int in_pcbbind __P((struct inpcb *, struct sockaddr *, struct thread *)); +int in_pcbbind __P((struct inpcb *, const struct sockaddr *, + struct thread *)); int in_pcbconnect __P((struct inpcb *, struct sockaddr *, struct thread *)); void in_pcbdetach __P((struct inpcb *)); void in_pcbdisconnect __P((struct inpcb *));