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 { |