From 2ffb83af6f17bf621c364dcec4e721cde4d0bb60 Mon Sep 17 00:00:00 2001 From: Juan Carrano Date: Thu, 29 Nov 2018 14:04:01 +0100 Subject: [PATCH] pkg/nimble: add patch to fix pointer alignment issue. Nimble contains a couple of casts that discard alignment information. This causes a warning with clang's -Wno-address-of-packed-member. A previous PR (#10503) supressed that warning. This commit re-enables them and provides a patch to fix the offending code. The fix has been submitted upstream, see https://github.com/apache/mynewt-nimble/pull/252 --- pkg/nimble/Makefile | 1 - ...do-not-discard-alignment-information.patch | 86 +++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 pkg/nimble/patches/0001-L2CAP-sm-do-not-discard-alignment-information.patch diff --git a/pkg/nimble/Makefile b/pkg/nimble/Makefile index 1116ec1d84..27899da60c 100644 --- a/pkg/nimble/Makefile +++ b/pkg/nimble/Makefile @@ -15,7 +15,6 @@ ifeq (llvm,$(TOOLCHAIN)) # tell LLVM/clang not to be so pedantic with this. CFLAGS += -Wno-unused-function CFLAGS += -Wno-sometimes-uninitialized - CFLAGS += -Wno-address-of-packed-member else CFLAGS += -Wno-unused-but-set-variable endif diff --git a/pkg/nimble/patches/0001-L2CAP-sm-do-not-discard-alignment-information.patch b/pkg/nimble/patches/0001-L2CAP-sm-do-not-discard-alignment-information.patch new file mode 100644 index 0000000000..7d8de78d27 --- /dev/null +++ b/pkg/nimble/patches/0001-L2CAP-sm-do-not-discard-alignment-information.patch @@ -0,0 +1,86 @@ +From 5986ec94d49cb4121e37114def029255e2b73b05 Mon Sep 17 00:00:00 2001 +From: Juan Carrano +Date: Thu, 29 Nov 2018 13:40:36 +0100 +Subject: [PATCH] L2CAP sm: do not discard alignment information. + +ble_sm_gen_ediv and ble_sm_gen_master_id_rand took a simple pointer to +integers, but were being called with pointers to members of a packed +struct. This discarded the alignment information. + +Not only did it produce an error with clang's -Wno-address-of-packed-member, +but it may also cause an error in a platform with alignment requirements. + +The solution was to modify both procedures to take a pointer to the whole +structure instead of only the members. +--- + nimble/host/src/ble_sm.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/nimble/host/src/ble_sm.c b/nimble/host/src/ble_sm.c +index c2cf97aa..09b33bf5 100644 +--- a/nimble/host/src/ble_sm.c ++++ b/nimble/host/src/ble_sm.c +@@ -261,19 +261,19 @@ ble_sm_gen_pair_rand(uint8_t *pair_rand) + } + + static int +-ble_sm_gen_ediv(uint16_t *ediv) ++ble_sm_gen_ediv(struct ble_sm_master_id *master_id) + { + int rc; + + #if MYNEWT_VAL(BLE_HS_DEBUG) + if (ble_sm_dbg_next_ediv_set) { + ble_sm_dbg_next_ediv_set = 0; +- *ediv = ble_sm_dbg_next_ediv; ++ master_id->ediv = ble_sm_dbg_next_ediv; + return 0; + } + #endif + +- rc = ble_hs_hci_util_rand(ediv, sizeof *ediv); ++ rc = ble_hs_hci_util_rand(&master_id->ediv, sizeof master_id->ediv); + if (rc != 0) { + return rc; + } +@@ -282,19 +282,19 @@ ble_sm_gen_ediv(uint16_t *ediv) + } + + static int +-ble_sm_gen_master_id_rand(uint64_t *master_id_rand) ++ble_sm_gen_master_id_rand(struct ble_sm_master_id *master_id) + { + int rc; + + #if MYNEWT_VAL(BLE_HS_DEBUG) + if (ble_sm_dbg_next_master_id_rand_set) { + ble_sm_dbg_next_master_id_rand_set = 0; +- *master_id_rand = ble_sm_dbg_next_master_id_rand; ++ master_id->rand_val = ble_sm_dbg_next_master_id_rand; + return 0; + } + #endif + +- rc = ble_hs_hci_util_rand(master_id_rand, sizeof *master_id_rand); ++ rc = ble_hs_hci_util_rand(&master_id->rand_val, sizeof master_id->rand_val); + if (rc != 0) { + return rc; + } +@@ -2051,12 +2051,12 @@ ble_sm_key_exch_exec(struct ble_sm_proc *proc, struct ble_sm_result *res, + goto err; + } + +- rc = ble_sm_gen_ediv(&master_id->ediv); ++ rc = ble_sm_gen_ediv(master_id); + if (rc != 0) { + os_mbuf_free_chain(txom); + goto err; + } +- rc = ble_sm_gen_master_id_rand(&master_id->rand_val); ++ rc = ble_sm_gen_master_id_rand(master_id); + if (rc != 0) { + os_mbuf_free_chain(txom); + goto err; +-- +2.19.2 +