From 28cf717c04ac33e5110f0c07dea28a920cf71fe3 Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Fri, 23 Nov 2012 11:09:12 +0100 Subject: [PATCH] sdp: Fix build errors due to unaligned memory access This fix following compilation errors on ARM. CC lib/sdp.lo lib/sdp.c: In function 'sdp_device_record_unregister_binary': lib/sdp.c:2984:11: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c:2984:11: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c: In function 'sdp_device_record_update': lib/sdp.c:3089:11: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c:3089:11: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c: In function 'sdp_process': lib/sdp.c:4139:22: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c:4146:14: error: cast increases required alignment of target type [-Werror=cast-align] lib/sdp.c:4146:14: error: cast increases required alignment of target type [-Werror=cast-align] cc1: all warnings being treated as errors make[1]: *** [lib/sdp.lo] Error 1 --- lib/sdp.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/sdp.c b/lib/sdp.c index dbffec06d..a760b733a 100644 --- a/lib/sdp.c +++ b/lib/sdp.c @@ -2984,7 +2984,6 @@ int sdp_device_record_unregister_binary(sdp_session_t *session, bdaddr_t *device rsphdr = (sdp_pdu_hdr_t *) rspbuf; p = rspbuf + sizeof(sdp_pdu_hdr_t); - status = bt_get_unaligned((uint16_t *) p); if (rsphdr->pdu_id == SDP_ERROR_RSP) { /* For this case the status always is invalid record handle */ @@ -2993,6 +2992,12 @@ int sdp_device_record_unregister_binary(sdp_session_t *session, bdaddr_t *device } else if (rsphdr->pdu_id != SDP_SVC_REMOVE_RSP) { errno = EPROTO; status = -1; + } else { + uint16_t tmp; + + memcpy(&tmp, p, sizeof(tmp)); + + status = tmp; } end: free(reqbuf); @@ -3089,7 +3094,6 @@ int sdp_device_record_update(sdp_session_t *session, bdaddr_t *device, const sdp rsphdr = (sdp_pdu_hdr_t *) rspbuf; p = rspbuf + sizeof(sdp_pdu_hdr_t); - status = bt_get_unaligned((uint16_t *) p); if (rsphdr->pdu_id == SDP_ERROR_RSP) { /* The status can be invalid sintax or invalid record handle */ @@ -3098,6 +3102,12 @@ int sdp_device_record_update(sdp_session_t *session, bdaddr_t *device, const sdp } else if (rsphdr->pdu_id != SDP_SVC_UPDATE_RSP) { errno = EPROTO; status = -1; + } else { + uint16_t tmp; + + memcpy(&tmp, p, sizeof(tmp)); + + status = tmp; } end: free(reqbuf); @@ -4139,14 +4149,18 @@ int sdp_process(sdp_session_t *session) rsp_count = sizeof(tsrc) + sizeof(csrc) + csrc * 4; } else { /* point to the first csrc */ - uint16_t *pcsrc = (uint16_t *) (t->rsp_concat_buf.data + 2); + uint8_t *pcsrc = t->rsp_concat_buf.data + 2; + uint16_t tcsrc, tcsrc2; /* FIXME: update the interface later. csrc doesn't need be passed to clients */ pdata += sizeof(uint16_t); /* point to csrc */ /* the first csrc contains the sum of partial csrc responses */ - *pcsrc += bt_get_unaligned((uint16_t *) pdata); + memcpy(&tcsrc, pcsrc, sizeof(tcsrc)); + memcpy(&tcsrc2, pdata, sizeof(tcsrc2)); + tcsrc += tcsrc2; + memcpy(pcsrc, &tcsrc, sizeof(tcsrc)); pdata += sizeof(uint16_t); /* point to the first handle */ rsp_count = csrc * 4; -- 2.47.3