Change in ...osmo-ggsn[master]: sgsnemu: Fix unaligned pointer access during ip/icmp checksum

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Mon Jul 29 16:06:46 UTC 2019


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/14980


Change subject: sgsnemu: Fix unaligned pointer access during ip/icmp checksum
......................................................................

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
---
M sgsnemu/sgsnemu.c
1 file changed, 12 insertions(+), 8 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/80/14980/1

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 @@
 {
 
 	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 @@
 	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 @@
 		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 @@
 	/* 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;

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/14980
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I783f104c31234a07f2a13f6dbc577a71b25b36a7
Gerrit-Change-Number: 14980
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190729/c605fa97/attachment.htm>


More information about the gerrit-log mailing list