summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/udp6_usrreq.c
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2009-02-05 15:04:23 +0000
committerjamie <jamie@FreeBSD.org>2009-02-05 15:04:23 +0000
commitaac9010144aaa9beca1c58d4859ec453774363b0 (patch)
tree9962a709b2dcf5cfba8085ebc965b27d4d1e1e8a /sys/netinet6/udp6_usrreq.c
parentbeddfe59b032db4229498b2f018c8d86779f5536 (diff)
downloadFreeBSD-src-aac9010144aaa9beca1c58d4859ec453774363b0.zip
FreeBSD-src-aac9010144aaa9beca1c58d4859ec453774363b0.tar.gz
Don't bother null-checking the thread pointer before the prison checks
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)
Diffstat (limited to 'sys/netinet6/udp6_usrreq.c')
-rw-r--r--sys/netinet6/udp6_usrreq.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index d0bcfc0..05d48f5 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -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) {
OpenPOWER on IntegriCloud