File: samemachine_ip6_overflow.patch

package info (click to toggle)
ssvnc 1.0.29-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,304 kB
  • sloc: ansic: 20,798; tcl: 15,833; java: 8,263; sh: 3,640; makefile: 2,041; perl: 41
file content (44 lines) | stat: -rw-r--r-- 1,744 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 {