diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-21 10:22:26 +0800 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-21 16:40:09 +0800 |
commit | 1afbd76155ca72b215f41f4870e5cdf91afd8f3c (patch) | |
tree | 4ed06cbce2247e36d48076543d284ed99d9c5365 /openbsc/src/abis_nm.c | |
parent | 34949ae9242445a6047dd289e149aae0d41871cb (diff) |
abis_nm.c: Reading the in_addr can lead to unaligned memory access
The value of the in_addr might not be 32 bit aligned and reading
it can generate an alignment error on ARM. Fix it by using memcpy
to copy the data into a local variable.
There are many more potential alignment issues that we will fix
when we hit them.
Diffstat (limited to 'openbsc/src/abis_nm.c')
-rw-r--r-- | openbsc/src/abis_nm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/openbsc/src/abis_nm.c b/openbsc/src/abis_nm.c index 63d9d9c3c..848755625 100644 --- a/openbsc/src/abis_nm.c +++ b/openbsc/src/abis_nm.c @@ -2704,6 +2704,7 @@ static const char ipaccess_magic[] = "com.ipaccess"; static int abis_nm_rx_ipacc(struct msgb *msg) { + struct in_addr addr; struct abis_om_hdr *oh = msgb_l2(msg); struct abis_om_fom_hdr *foh; u_int8_t idstrlen = oh->data[0]; @@ -2725,10 +2726,12 @@ static int abis_nm_rx_ipacc(struct msgb *msg) switch (foh->msg_type) { case NM_MT_IPACC_RSL_CONNECT_ACK: DEBUGPC(DNM, "RSL CONNECT ACK "); - if (TLVP_PRESENT(&tp, NM_ATT_IPACC_DST_IP)) - DEBUGPC(DNM, "IP=%s ", - inet_ntoa(*((struct in_addr *) - TLVP_VAL(&tp, NM_ATT_IPACC_DST_IP)))); + if (TLVP_PRESENT(&tp, NM_ATT_IPACC_DST_IP)) { + memcpy(&addr, + TLVP_VAL(&tp, NM_ATT_IPACC_DST_IP), sizeof(addr)); + + DEBUGPC(DNM, "IP=%s ", inet_ntoa(addr)); + } if (TLVP_PRESENT(&tp, NM_ATT_IPACC_DST_IP_PORT)) DEBUGPC(DNM, "PORT=%u ", ntohs(*((u_int16_t *) |