ping: Fix aliasing violations

Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
diff --git a/ping.c b/ping.c
index 2b41f44..d61df40 100644
--- a/ping.c
+++ b/ping.c
@@ -117,7 +117,10 @@
 	int socket_errno;
 	u_char *packet;
 	char *target, hnamebuf[MAXHOSTNAMELEN];
-	char rspace[3 + 4 * NROUTES + 1];	/* record route space */
+	union {
+		char rspace[3 + 4 * NROUTES + 1];       /* record route space */
+		uint32_t rspace32[(3 + 4 * NROUTES + 1)/4];
+	} rsp;
 
 #ifdef ANDROID
 	if (getauxval(AT_SECURE) != 0) {
@@ -428,32 +431,32 @@
 
 	/* record route option */
 	if (options & F_RROUTE) {
-	        bzero(rspace, sizeof(rspace));
-		rspace[0] = IPOPT_NOP;
-		rspace[1+IPOPT_OPTVAL] = IPOPT_RR;
-		rspace[1+IPOPT_OLEN] = sizeof(rspace)-1;
-		rspace[1+IPOPT_OFFSET] = IPOPT_MINOFF;
+		bzero(rsp.rspace, sizeof(rsp.rspace));
+		rsp.rspace[0] = IPOPT_NOP;
+		rsp.rspace[1+IPOPT_OPTVAL] = IPOPT_RR;
+		rsp.rspace[1+IPOPT_OLEN] = sizeof(rsp.rspace)-1;
+		rsp.rspace[1+IPOPT_OFFSET] = IPOPT_MINOFF;
 		optlen = 40;
-		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rspace, sizeof(rspace)) < 0) {
+		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rsp.rspace, sizeof(rsp.rspace)) < 0) {
 			perror("ping: record route");
 			exit(2);
 		}
 	}
 	if (options & F_TIMESTAMP) {
-	        bzero(rspace, sizeof(rspace));
-		rspace[0] = IPOPT_TIMESTAMP;
-		rspace[1] = (ts_type==IPOPT_TS_TSONLY ? 40 : 36);
-		rspace[2] = 5;
-		rspace[3] = ts_type;
+		bzero(rsp.rspace, sizeof(rsp.rspace));
+		rsp.rspace[0] = IPOPT_TIMESTAMP;
+		rsp.rspace[1] = (ts_type==IPOPT_TS_TSONLY ? 40 : 36);
+		rsp.rspace[2] = 5;
+		rsp.rspace[3] = ts_type;
 		if (ts_type == IPOPT_TS_PRESPEC) {
 			int i;
-			rspace[1] = 4+nroute*8;
+			rsp.rspace[1] = 4+nroute*8;
 			for (i=0; i<nroute; i++)
-				*(__u32*)&rspace[4+i*8] = route[i];
+				rsp.rspace32[(4+i*8)/4] = route[i];
 		}
-		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rspace, rspace[1]) < 0) {
-			rspace[3] = 2;
-			if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rspace, rspace[1]) < 0) {
+		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rsp.rspace, rsp.rspace[1]) < 0) {
+			rsp.rspace[3] = 2;
+			if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rsp.rspace, rsp.rspace[1]) < 0) {
 				perror("ping: ts option");
 				exit(2);
 			}
@@ -462,16 +465,16 @@
 	}
 	if (options & F_SOURCEROUTE) {
 	        int i;
-	        bzero(rspace, sizeof(rspace));
-		rspace[0] = IPOPT_NOOP;
-		rspace[1+IPOPT_OPTVAL] = (options & F_SO_DONTROUTE) ? IPOPT_SSRR
+		bzero(rsp.rspace, sizeof(rsp.rspace));
+		rsp.rspace[0] = IPOPT_NOOP;
+		rsp.rspace[1+IPOPT_OPTVAL] = (options & F_SO_DONTROUTE) ? IPOPT_SSRR
 			: IPOPT_LSRR;
-		rspace[1+IPOPT_OLEN] = 3 + nroute*4;
-		rspace[1+IPOPT_OFFSET] = IPOPT_MINOFF;
+		rsp.rspace[1+IPOPT_OLEN] = 3 + nroute*4;
+		rsp.rspace[1+IPOPT_OFFSET] = IPOPT_MINOFF;
 		for (i=0; i<nroute; i++)
-			*(__u32*)&rspace[4+i*4] = route[i];
+			rsp.rspace32[(4+i*4)/4] = route[i];
 		
-		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rspace, 4 + nroute*4) < 0) {
+		if (setsockopt(icmp_sock, IPPROTO_IP, IP_OPTIONS, rsp.rspace, 4 + nroute*4) < 0) {
 			perror("ping: record route");
 			exit(2);
 		}