Index: in_pcb.c =================================================================== RCS file: /private/FreeBSD/src/sys/netinet/in_pcb.c,v retrieving revision 1.59.2.27 diff -u -p -r1.59.2.27 in_pcb.c --- in_pcb.c 2 Jan 2004 04:06:42 -0000 1.59.2.27 +++ in_pcb.c 20 Feb 2004 14:00:11 -0000 @@ -508,18 +508,8 @@ in_pcbconnect(inp, nam, p) { struct sockaddr_in *ifaddr; struct sockaddr_in *sin = (struct sockaddr_in *)nam; - struct sockaddr_in sa; int error; - if (inp->inp_laddr.s_addr == INADDR_ANY && p->p_prison != NULL) { - bzero(&sa, sizeof (sa)); - sa.sin_addr.s_addr = htonl(p->p_prison->pr_ip); - sa.sin_len=sizeof (sa); - sa.sin_family = AF_INET; - error = in_pcbbind(inp, (struct sockaddr *)&sa, p); - if (error) - return (error); - } /* * Call inner routine, to assign local interface address. */ @@ -533,7 +523,19 @@ in_pcbconnect(inp, nam, p) } if (inp->inp_laddr.s_addr == INADDR_ANY) { if (inp->inp_lport == 0) { - error = in_pcbbind(inp, (struct sockaddr *)0, p); + if (p->p_prison != NULL) { + struct sockaddr_in sa; + + bzero(&sa, sizeof(sa)); + sa.sin_addr.s_addr = htonl(p->p_prison->pr_ip); + sa.sin_len = sizeof (sa); + sa.sin_family = AF_INET; + error = in_pcbbind(inp, (struct sockaddr *)&sa, + p); + } else { + error = in_pcbbind(inp, (struct sockaddr *)0, + p); + } if (error) return (error); }