Skip to content

Commit

Permalink
Don't bother null-checking the thread pointer before the prison checks
Browse files Browse the repository at this point in the history
in udp6_connect (td is already dereferenced elsewhere without such a
check).  This makes the conversion from a sockaddr to a sockaddr_in6
always happen, so convert once at the beginning of the function rather
than twice in the middle.

Approved by:	bz (mentor)
  • Loading branch information
jamie authored and jamie committed Feb 5, 2009
1 parent beddfe5 commit aac9010
Showing 1 changed file with 22 additions and 27 deletions.
49 changes: 22 additions & 27 deletions sys/netinet6/udp6_usrreq.c
Expand Up @@ -883,48 +883,43 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
{
INIT_VNET_INET(so->so_vnet);
struct inpcb *inp;
struct sockaddr_in6 *sin6;
int error;

inp = sotoinpcb(so);
sin6 = (struct sockaddr_in6 *)nam;
KASSERT(inp != NULL, ("udp6_connect: inp == NULL"));

INP_INFO_WLOCK(&V_udbinfo);
INP_WLOCK(inp);
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
struct sockaddr_in6 *sin6_p;

sin6_p = (struct sockaddr_in6 *)nam;
if (IN6_IS_ADDR_V4MAPPED(&sin6_p->sin6_addr)) {
struct sockaddr_in sin;
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0 &&
IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
struct sockaddr_in sin;

if (inp->inp_faddr.s_addr != INADDR_ANY) {
error = EISCONN;
goto out;
}
in6_sin6_2_sin(&sin, sin6_p);
if (td && (error = prison_remote_ip4(td->td_ucred,
&sin.sin_addr)) != 0)
goto out;
error = in_pcbconnect(inp, (struct sockaddr *)&sin,
td->td_ucred);
if (error == 0) {
inp->inp_vflag |= INP_IPV4;
inp->inp_vflag &= ~INP_IPV6;
soisconnected(so);
}
if (inp->inp_faddr.s_addr != INADDR_ANY) {
error = EISCONN;
goto out;
}
in6_sin6_2_sin(&sin, sin6);
error = prison_remote_ip4(td->td_ucred, &sin.sin_addr);
if (error != 0)
goto out;
error = in_pcbconnect(inp, (struct sockaddr *)&sin,
td->td_ucred);
if (error == 0) {
inp->inp_vflag |= INP_IPV4;
inp->inp_vflag &= ~INP_IPV6;
soisconnected(so);
}
goto out;
}
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
error = EISCONN;
goto out;
}
if (td) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
if ((error = prison_remote_ip6(td->td_ucred,
&sin6->sin6_addr)) != 0)
goto out;
}
error = prison_remote_ip6(td->td_ucred, &sin6->sin6_addr);
if (error != 0)
goto out;
error = in6_pcbconnect(inp, nam, td->td_ucred);
if (error == 0) {
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
Expand Down

0 comments on commit aac9010

Please sign in to comment.