[PATCH xserver 1/2] os: Fix a type error in the IPv6 XDMCP code
Adam Jackson
ajax at redhat.com
Wed Dec 13 19:53:56 UTC 2017
Building with strict-aliasing rightly chirps here:
../os/xdmcp.c: In function ‘XdmcpRegisterConnection’:
../os/xdmcp.c:489:31: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
&((struct sockaddr_in6 *) &address)->sin6_addr.s6_addr[12];
^~~~~~~~~~~~
We have "const char *address", so &address here is a char ** (i.e., it
points to the slot on the stack containing the pointer to the character
array passed in as an argument). Casting that to a struct sockaddr_in6 *
is wrong, because it means that area of the stack will be reinterpreted
as a struct sockaddr_in6.
Instead, cast address, not &address.
Signed-off-by: Adam Jackson <ajax at redhat.com>
---
os/xdmcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/os/xdmcp.c b/os/xdmcp.c
index 7aeb393e63..d8c81fbf83 100644
--- a/os/xdmcp.c
+++ b/os/xdmcp.c
@@ -486,7 +486,7 @@ XdmcpRegisterConnection(int type, const char *address, int addrlen)
IN6_IS_ADDR_V4MAPPED((const struct in6_addr *) address)) {
fromAddr = &((struct sockaddr_in *) &FromAddress)->sin_addr;
regAddr =
- &((struct sockaddr_in6 *) &address)->sin6_addr.s6_addr[12];
+ &((struct sockaddr_in6 *) address)->sin6_addr.s6_addr[12];
regAddrlen = sizeof(struct in_addr);
}
}
--
2.14.3
More information about the xorg-devel
mailing list