[Bugfix] Fix crash in TcpSocket::sameMachine for IPv6 connections (alan dot coopersmith at sun dot com)


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3918 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/network/TcpSocket.cxx b/common/network/TcpSocket.cxx
index 7fd9c6a..93cdceb 100644
--- a/common/network/TcpSocket.cxx
+++ b/common/network/TcpSocket.cxx
@@ -293,13 +293,27 @@
 }
 
 bool TcpSocket::sameMachine() {
-  struct sockaddr_in peeraddr, myaddr;
-  socklen_t addrlen = sizeof(struct sockaddr_in);
+  vnc_sockaddr_t peeraddr, myaddr;
+  socklen_t addrlen;
 
-  getpeername(getFd(), (struct sockaddr *)&peeraddr, &addrlen);
-  getsockname(getFd(), (struct sockaddr *)&myaddr, &addrlen);
+  addrlen = sizeof(peeraddr);
+  if (getpeername(getFd(), &peeraddr.u.sa, &addrlen) < 0)
+      throw SocketException ("unable to get peer address", errorNumber);
 
-  return (peeraddr.sin_addr.s_addr == myaddr.sin_addr.s_addr);
+  addrlen = sizeof(myaddr); /* need to reset, since getpeername overwrote */
+  if (getsockname(getFd(), &myaddr.u.sa, &addrlen) < 0)
+      throw SocketException ("unable to get my address", errorNumber);
+
+  if (peeraddr.u.sa.sa_family != myaddr.u.sa.sa_family)
+      return false;
+
+#ifdef HAVE_GETADDRINFO
+  if (peeraddr.u.sa.sa_family == AF_INET6)
+      return IN6_ARE_ADDR_EQUAL(&peeraddr.u.sin6.sin6_addr,
+				&myaddr.u.sin6.sin6_addr);
+#endif
+
+  return (peeraddr.u.sin.sin_addr.s_addr == myaddr.u.sin.sin_addr.s_addr);
 }
 
 void TcpSocket::shutdown()