os: Fix a type error in the IPv6 XDMCP code
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@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									da4ffb2f6a
								
							
						
					
					
						commit
						652913cd94
					
				|  | @ -486,7 +486,7 @@ XdmcpRegisterConnection(int type, const char *address, int addrlen) | ||||||
|                      IN6_IS_ADDR_V4MAPPED((const struct in6_addr *) address)) { |                      IN6_IS_ADDR_V4MAPPED((const struct in6_addr *) address)) { | ||||||
|                 fromAddr = &((struct sockaddr_in *) &FromAddress)->sin_addr; |                 fromAddr = &((struct sockaddr_in *) &FromAddress)->sin_addr; | ||||||
|                 regAddr = |                 regAddr = | ||||||
|                     &((struct sockaddr_in6 *) &address)->sin6_addr.s6_addr[12]; |                     &((struct sockaddr_in6 *) address)->sin6_addr.s6_addr[12]; | ||||||
|                 regAddrlen = sizeof(struct in_addr); |                 regAddrlen = sizeof(struct in_addr); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue