Skip to content

Commit

Permalink
nimble/host: Fix compilation error in ble_store_config.c
Browse files Browse the repository at this point in the history
This should fix compilation error when -O2 optimization is enabled.
GCC incorrectly detects problem.
This change adds asserts that convinces GCC that pre-condition will not
result in accessing memory out-of-bounds.

This also changes one condition that also contributes to make GCC convinced
that pre-condition are met.

Error: In function 'ble_store_config_delete_obj',
    inlined from 'ble_store_config_delete_cccd' at repos/apache-mynewt-nimble/nimble/host/store/config/src/ble_store_config.c:380:10,
    inlined from 'ble_store_config_delete' at repos/apache-mynewt-nimble/nimble/host/store/config/src/ble_store_config.c:542:14:
repos/apache-mynewt-nimble/nimble/host/store/config/src/ble_store_config.c:193:9: error: 'memmove' offset [16, 31] is out of the bounds [0, 16] of object 'ble_store_config_cccds' with type 'struct ble_store_value_cccd[1]' [-Werror=array-bounds]
  193 |         memmove(dst, src, move_count * value_size);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
repos/apache-mynewt-nimble/nimble/host/store/config/src/ble_store_config.c: In function 'ble_store_config_delete':
repos/apache-mynewt-nimble/nimble/host/store/config/src/ble_store_config.c:45:5: note: 'ble_store_config_cccds' declared here
   45 |     ble_store_config_cccds[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)];

Signed-off-by: Jerzy Kasenberg <jerzy.kasenberg@codecoup.pl>
  • Loading branch information
kasjer committed Mar 25, 2024
1 parent 0bffd7a commit 608bc6c
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion nimble/host/store/config/src/ble_store_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ ble_store_config_delete_our_sec(const struct ble_store_key_sec *key_sec)
#if MYNEWT_VAL(BLE_STORE_MAX_BONDS)
int rc;

assert(ble_store_config_num_our_secs <= ARRAY_SIZE(ble_store_config_our_secs));
rc = ble_store_config_delete_sec(key_sec, ble_store_config_our_secs,
&ble_store_config_num_our_secs);
if (rc != 0) {
Expand All @@ -248,6 +249,7 @@ ble_store_config_delete_peer_sec(const struct ble_store_key_sec *key_sec)
#if MYNEWT_VAL(BLE_STORE_MAX_BONDS)
int rc;

assert(ble_store_config_num_peer_secs <= ARRAY_SIZE(ble_store_config_peer_secs));
rc = ble_store_config_delete_sec(key_sec, ble_store_config_peer_secs,
&ble_store_config_num_peer_secs);
if (rc != 0) {
Expand Down Expand Up @@ -369,10 +371,11 @@ ble_store_config_delete_cccd(const struct ble_store_key_cccd *key_cccd)
int rc;

idx = ble_store_config_find_cccd(key_cccd);
if (idx == -1) {
if (idx < 0) {
return BLE_HS_ENOENT;
}

assert(ble_store_config_num_cccds < ARRAY_SIZE(ble_store_config_cccds));
rc = ble_store_config_delete_obj(ble_store_config_cccds,
sizeof *ble_store_config_cccds,
idx,
Expand Down

0 comments on commit 608bc6c

Please sign in to comment.