return len;
}
-static int authname_match(enum auth_protos kind, char *name, int namelen)
+static int authname_match(enum auth_protos kind, char *name, size_t namelen)
{
if(strlen(authnames[kind]) != namelen)
return 0;
return 1;
}
+#define SIN6_ADDR(s) (&((struct sockaddr_in6 *)s)->sin6_addr)
+
static Xauth *get_authptr(struct sockaddr *sockname, unsigned int socknamelen,
int display)
{
family = FamilyLocal; /* 256 */
switch(sockname->sa_family)
{
+#ifdef AF_INET6
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;
}
addr += 12;
/* if v4-mapped, fall through. */
+#endif
case AF_INET:
if(!addr)
addr = (char *) &((struct sockaddr_in *)sockname)->sin_addr;
APPEND(info->data, j, si->sin_port);
}
break;
+#ifdef AF_INET6
case AF_INET6:
/*block*/ {
struct sockaddr_in6 *si6 = (struct sockaddr_in6 *) sockname;
- if(IN6_IS_ADDR_V4MAPPED(si6->sin6_addr.s6_addr))
+ if(IN6_IS_ADDR_V4MAPPED(SIN6_ADDR(sockname)))
{
- APPEND(info->data, j, si6->sin6_addr.s6_addr[12]);
+ do_append(info->data, &j, &si6->sin6_addr.s6_addr[12], 4);
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. */
- long fakeaddr = 0;
- short fakeport = 0;
+ uint32_t fakeaddr = 0;
+ uint16_t fakeport = 0;
APPEND(info->data, j, fakeaddr);
APPEND(info->data, j, fakeport);
}
}
break;
+#endif
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);
}
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);
int ret = 1;
if (getpeername(fd, sockname, &socknamelen) == -1)
- return 0; /* can only authenticate sockets */
+ {
+ if (getsockname(fd, sockname, &socknamelen) == -1)
+ return 0; /* can only authenticate sockets */
+ if (sockname->sa_family != AF_UNIX)
+ return 0;
+ /* Some systems like hpux or Hurd do not expose peer names
+ * for UNIX Domain Sockets. We do not need it anyway. */
+ }
authptr = get_authptr(sockname, socknamelen, display);
if (authptr == 0)