Subversion Repositories

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

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
43 magnus 1
Description: Use a struct sockaddr_storage to retrieve local and peer addresses and compare according to address family.
2
 Also check if -rawlocal was specified before even checking whether the remote machine is the local one.
3
Bug-Debian: https://bugs.debian.org/774622
4
 
5
--- a/vnc_unixsrc/vncviewer/sockets.c
6
+++ b/vnc_unixsrc/vncviewer/sockets.c
7
@@ -1165,13 +1165,21 @@ char *ip2host(char *ip) {
8
 Bool
9
 SameMachine(int sock)
10
 {
11
-  struct sockaddr_in peeraddr, myaddr;
12
-  int addrlen = sizeof(struct sockaddr_in);
13
+  struct sockaddr_storage peeraddr, myaddr;
14
+  int addrlen = sizeof(struct sockaddr_storage);
15
 
16
   getpeername(sock, (struct sockaddr *)&peeraddr, &addrlen);
17
   getsockname(sock, (struct sockaddr *)&myaddr, &addrlen);
18
 
19
-  return (peeraddr.sin_addr.s_addr == myaddr.sin_addr.s_addr);
20
+  assert(((struct sockaddr*)&peeraddr)->sa_family == ((struct sockaddr*)&myaddr)->sa_family);
21
+  if (((struct sockaddr*)&myaddr)->sa_family == AF_INET6) {
22
+      return 0 == memcmp(&((struct sockaddr_in6*)&peeraddr)->sin6_addr.s6_addr,
23
+                        &((struct sockaddr_in6*)&myaddr)->sin6_addr.s6_addr,
24
+                        sizeof(struct in6_addr));
25
+  } else {
26
+      return ((struct sockaddr_in*)&peeraddr)->sin_addr.s_addr
27
+         == ((struct sockaddr_in*)&myaddr)->sin_addr.s_addr;
28
+  }
29
 }
30
 
31
 
32
--- a/vnc_unixsrc/vncviewer/rfbproto.c
33
+++ b/vnc_unixsrc/vncviewer/rfbproto.c
34
@@ -2204,8 +2204,8 @@ if (getenv("DEBUG_SETFORMAT")) {
35
   } else {
36
        /* DIFFERENT CASE */
37
 
38
-    if (SameMachine(rfbsock)) {
39
-      if (!tunnelSpecified && appData.useRawLocal) {
40
+    if (appData.useRawLocal && SameMachine(rfbsock)) {
41
+      if (!tunnelSpecified) {
42
        fprintf(stderr,"Same machine: preferring raw encoding\n");
43
        encs[se->nEncodings++] = Swap32IfLE(rfbEncodingRaw);
44
       } else {