Subversion Repositories

?revision_form?Rev ?revision_input??revision_submit??revision_endform?

Blame | Last modification | View Log | RSS feed

Description: Use a struct sockaddr_storage to retrieve local and peer addresses and compare according to address family.
 Also check if -rawlocal was specified before even checking whether the remote machine is the local one.
Bug-Debian: https://bugs.debian.org/774622

--- a/vnc_unixsrc/vncviewer/sockets.c
+++ b/vnc_unixsrc/vncviewer/sockets.c
@@ -1165,13 +1165,21 @@ char *ip2host(char *ip) {
 Bool
 SameMachine(int sock)
 {
-  struct sockaddr_in peeraddr, myaddr;
-  int addrlen = sizeof(struct sockaddr_in);
+  struct sockaddr_storage peeraddr, myaddr;
+  int addrlen = sizeof(struct sockaddr_storage);
 
   getpeername(sock, (struct sockaddr *)&peeraddr, &addrlen);
   getsockname(sock, (struct sockaddr *)&myaddr, &addrlen);
 
-  return (peeraddr.sin_addr.s_addr == myaddr.sin_addr.s_addr);
+  assert(((struct sockaddr*)&peeraddr)->sa_family == ((struct sockaddr*)&myaddr)->sa_family);
+  if (((struct sockaddr*)&myaddr)->sa_family == AF_INET6) {
+      return 0 == memcmp(&((struct sockaddr_in6*)&peeraddr)->sin6_addr.s6_addr,
+                        &((struct sockaddr_in6*)&myaddr)->sin6_addr.s6_addr,
+                        sizeof(struct in6_addr));
+  } else {
+      return ((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr
+         == ((struct sockaddr_in*)&myaddr)->sin_addr.s_addr;
+  }
 }
 
 
--- a/vnc_unixsrc/vncviewer/rfbproto.c
+++ b/vnc_unixsrc/vncviewer/rfbproto.c
@@ -2204,8 +2204,8 @@ if (getenv("DEBUG_SETFORMAT")) {
   } else {
        /* DIFFERENT CASE */
 
-    if (SameMachine(rfbsock)) {
-      if (!tunnelSpecified && appData.useRawLocal) {
+    if (appData.useRawLocal && SameMachine(rfbsock)) {
+      if (!tunnelSpecified) {
        fprintf(stderr,"Same machine: preferring raw encoding\n");
        encs[se->nEncodings++] = Swap32IfLE(rfbEncodingRaw);
       } else {