diff options
author | Bernhard Rosenkraenzer <Bernhard.Rosenkranzer@linaro.org> | 2013-07-25 15:14:36 +0530 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2013-07-25 15:14:36 +0530 |
commit | bbcd4fb0965ed13d56daf0c957051c2a4bf6132e (patch) | |
tree | 2cf5a6cda4b28b31db3317ca497b5706fcbaec67 | |
parent | 84b590fe10fda51eca755bc65a8eb00bd29ce702 (diff) | |
download | ping-linaro_android_4.3.1.tar.gz |
ping: Fix aliasing violationslinaro_android_4.3.1linaro_android_4.3
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
-rw-r--r-- | ping.c | 51 |
1 files changed, 27 insertions, 24 deletions
@@ -117,7 +117,10 @@ main(int argc, char **argv) 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 @@ main(int argc, char **argv) /* 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 @@ main(int argc, char **argv) } 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); } |