0,0 → 1,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 { |