Replace uses of "long" with uint32_t, and similar; fixes 64-bit bugs
[free-sw/xcb/libxcb] / src / xcb_auth.c
index a4745bc..ffc0515 100644 (file)
@@ -77,6 +77,8 @@ static int authname_match(enum auth_protos kind, char *name, int namelen)
     return 1;
 }
 
+#define SIN6_ADDR(s) (&((struct sockaddr_in6 *)s)->sin6_addr)
+
 static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen,
                           int display)
 {
@@ -92,11 +94,11 @@ static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen,
     switch(sockname->sa_family)
     {
     case AF_INET6:
-        addr = (char *) &((struct sockaddr_in6 *)sockname)->sin6_addr;
-        addrlen = sizeof(((struct sockaddr_in6 *)sockname)->sin6_addr);
-        if(!IN6_IS_ADDR_V4MAPPED(addr))
+        addr = (char *) SIN6_ADDR(sockname);
+        addrlen = sizeof(*SIN6_ADDR(sockname));
+        if(!IN6_IS_ADDR_V4MAPPED(SIN6_ADDR(sockname)))
         {
-            if(!IN6_IS_ADDR_LOOPBACK(addr))
+            if(!IN6_IS_ADDR_LOOPBACK(SIN6_ADDR(sockname)))
                 family = XCB_FAMILY_INTERNET_6;
             break;
         }
@@ -177,10 +179,30 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *
            APPEND(info->data, j, si->sin_port);
        }
        break;
+        case AF_INET6:
+            /*block*/ {
+            struct sockaddr_in6 *si6 = (struct sockaddr_in6 *) sockname;
+            if(IN6_IS_ADDR_V4MAPPED(SIN6_ADDR(sockname)))
+            {
+                APPEND(info->data, j, si6->sin6_addr.s6_addr[12]);
+                APPEND(info->data, j, si6->sin6_port);
+            }
+            else
+            {
+                /* XDM-AUTHORIZATION-1 does not handle IPv6 correctly.  Do the
+                   same thing Xlib does: use all zeroes for the 4-byte address
+                   and 2-byte port number. */
+                uint32_t fakeaddr = 0;
+                uint16_t fakeport = 0;
+                APPEND(info->data, j, fakeaddr);
+                APPEND(info->data, j, fakeport);
+            }
+        }
+        break;
         case AF_UNIX:
             /*block*/ {
-           long fakeaddr = htonl(0xffffffff - next_nonce());
-           short fakeport = htons(getpid());
+           uint32_t fakeaddr = htonl(0xffffffff - next_nonce());
+           uint16_t fakeport = htons(getpid());
            APPEND(info->data, j, fakeaddr);
            APPEND(info->data, j, fakeport);
        }
@@ -190,9 +212,7 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr *
             return 0;   /* do not know how to build this */
        }
        {
-           long now;
-           time(&now);
-           now = htonl(now);
+           uint32_t now = htonl(time(0));
            APPEND(info->data, j, now);
        }
        assert(j <= 192 / 8);