aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-07-29 18:03:04 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-07-29 18:06:20 +0200
commite47932976cf9d2e5a5771157a4cab5ac237ee99b (patch)
tree8359db088f13e7be5eedf4fbda28c7ed63251cc3
parentf1e01517bc667c40cd5bc9d4399685cf3cc14994 (diff)
sgsnemu: Fix unaligned pointer access during ip/icmp checksum
Catched by gcc 9.1.0: osmo-ggsn/sgsnemu/sgsnemu.c:1294:2: error: converting a packed struct ip_ping pointer (alignment 1) to a uint16_t {aka short unsigned int} pointer (alignment 2) may result in an unaligned pointer value [-Werror=address-of-packed-member] 1294 | p = (uint16_t *) & pack; Change-Id: I783f104c31234a07f2a13f6dbc577a71b25b36a7
-rw-r--r--sgsnemu/sgsnemu.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index 8e41031..4f1f844 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -1234,7 +1234,7 @@ static int create_ping(void *gsn, struct pdp_t *pdp,
{
struct ip_ping pack;
- uint16_t *p = (uint16_t *) & pack;
+ uint16_t v16;
uint8_t *p8 = (uint8_t *) & pack;
struct in_addr src;
unsigned int n;
@@ -1270,7 +1270,7 @@ static int create_ping(void *gsn, struct pdp_t *pdp,
pack.seq = htons(seq);
/* Generate ICMP payload */
- p8 = (uint8_t *) & pack + CREATEPING_IP + CREATEPING_ICMP;
+ p8 = (uint8_t *) &pack + CREATEPING_IP + CREATEPING_ICMP;
for (n = 0; n < (datasize); n++)
p8[n] = n;
@@ -1278,11 +1278,13 @@ static int create_ping(void *gsn, struct pdp_t *pdp,
gettimeofday(tp, &tz);
/* Calculate IP header checksum */
- p = (uint16_t *) & pack;
+ p8 = (uint8_t *) &pack;
count = CREATEPING_IP;
sum = 0;
while (count > 1) {
- sum += *p++;
+ memcpy(&v16, p8, 2);
+ sum += v16;
+ p8 += 2;
count -= 2;
}
while (sum >> 16)
@@ -1292,14 +1294,16 @@ static int create_ping(void *gsn, struct pdp_t *pdp,
/* Calculate ICMP checksum */
count = CREATEPING_ICMP + datasize; /* Length of ICMP message */
sum = 0;
- p = (uint16_t *) & pack;
- p += CREATEPING_IP / 2;
+ p8 = (uint8_t *) &pack;
+ p8 += CREATEPING_IP;
while (count > 1) {
- sum += *p++;
+ memcpy(&v16, p8, 2);
+ sum += v16;
+ p8 += 2;
count -= 2;
}
if (count > 0)
- sum += *(unsigned char *)p;
+ sum += *(unsigned char *)p8;
while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);
pack.checksum = ~sum;