Skip to content

Commit 7b0a3dc

Browse files
authored
Merge pull request #11918 from ARMmbed/IOTSTOR-978
IOTSTOR-978: Bugfixes to TDBStore and SecureStore
2 parents a467f0c + b82e106 commit 7b0a3dc

File tree

4 files changed

+45
-16
lines changed

4 files changed

+45
-16
lines changed

features/storage/TESTS/kvstore/general_tests_phase_1/main.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,18 @@ static int kv_setup = TDBStoreSet;
6868

6969
static const int heap_alloc_threshold_size = 4096;
7070

71+
static inline uint32_t align_up(uint32_t val, uint32_t size)
72+
{
73+
return (((val - 1) / size) + 1) * size;
74+
}
75+
7176
/*----------------initialization------------------*/
7277

7378
//init the blockdevice
7479
static void kvstore_init()
7580
{
7681
int res;
77-
size_t erase_size, ul_bd_size, rbp_bd_size;
82+
size_t program_size, erase_size, ul_bd_size, rbp_bd_size;
7883
BlockDevice *sec_bd;
7984

8085
res = bd->init();
@@ -109,10 +114,17 @@ static void kvstore_init()
109114
flash_bd = new FlashSimBlockDevice(bd);
110115
sec_bd = flash_bd;
111116
}
117+
res = sec_bd->init();
118+
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
119+
120+
program_size = sec_bd->get_program_size();
121+
erase_size = sec_bd->get_erase_size();
122+
// We must be able to hold at least 10 small keys (20 program sectors) and master record + internal data
123+
ul_bd_size = align_up(program_size * 40, erase_size);
124+
rbp_bd_size = align_up(program_size * 40, erase_size);
112125

113-
erase_size = sec_bd->get_erase_size();
114-
ul_bd_size = erase_size * 4;
115-
rbp_bd_size = erase_size * 2;
126+
res = sec_bd->deinit();
127+
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
116128

117129
ul_bd = new SlicingBlockDevice(sec_bd, 0, ul_bd_size);
118130
rbp_bd = new SlicingBlockDevice(sec_bd, ul_bd_size, ul_bd_size + rbp_bd_size);
@@ -407,14 +419,14 @@ static void set_several_key_value_sizes()
407419

408420
name[6] = 0;
409421

410-
for (i = 0; i < 26; i++) {
422+
for (i = 0; i < 5; i++) {
411423
c = i + 'a';
412424
name[5] = c;
413425
res = kvstore->set(name, name, sizeof(name), 0);
414426
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
415427
}
416428

417-
for (i = 0; i < 26; i++) {
429+
for (i = 0; i < 5; i++) {
418430
c = i + 'a';
419431
name[5] = c;
420432
res = kvstore->get(name, buffer, sizeof(buffer), &actual_size, 0);

features/storage/TESTS/kvstore/static_tests/main.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@ static const size_t data_size = 5;
3434
static size_t actual_size = 0;
3535
static const size_t buffer_size = 20;
3636
static const int num_of_threads = 3;
37-
static const char num_of_keys = 3;
37+
static const char num_of_keys = 11;
3838
#if defined(MBED_CONF_RTOS_PRESENT)
3939
/* Forked 3 threads plus misc, so minimum (4 * OS_STACK_SIZE) heap are required. */
4040
static const int heap_alloc_threshold_size = 4 * OS_STACK_SIZE;
4141
#else
4242
/* Bare metal does not require memory for threads, so use just minimum for test */
4343
static const int heap_alloc_threshold_size = MBED_CONF_TARGET_BOOT_STACK_SIZE;
4444
#endif
45-
static const char *keys[] = {"key1", "key2", "key3"};
45+
static const char *keys[num_of_keys] = { "key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9",
46+
"key10", "key11"
47+
};
4648

4749
static int init_res = MBED_ERROR_NOT_READY;
4850

@@ -298,14 +300,14 @@ static void set_several_key_value_sizes()
298300

299301
name[6] = 0;
300302

301-
for (i = 0; i < 26; i++) {
303+
for (i = 0; i < num_of_keys; i++) {
302304
c = i + 'a';
303305
name[5] = c;
304306
res = kv_set(name, name, sizeof(name), 0);
305307
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
306308
}
307309

308-
for (i = 0; i < 26; i++) {
310+
for (i = 0; i < num_of_keys; i++) {
309311
c = i + 'a';
310312
name[5] = c;
311313
res = kv_get(name, buffer, sizeof(buffer), &actual_size);
@@ -328,7 +330,7 @@ static void set_several_unvalid_key_names()
328330

329331
name[6] = 0;
330332

331-
for (i = 0; i < 11; i++) {
333+
for (i = 0; i < num_of_keys; i++) {
332334
name[5] = unvalid[i];
333335
res = kv_set(name, name, sizeof(name), 0);
334336
if (unvalid[i] != '/') {
@@ -817,7 +819,7 @@ static void iterator_next_full_list()
817819
res = kv_iterator_close(kvstore_it);
818820
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
819821

820-
for (i = 0; i < num_of_threads; i++) {
822+
for (i = 0; i < num_of_keys; i++) {
821823
res = kv_remove(keys[i]);
822824
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
823825
}
@@ -855,7 +857,7 @@ static void iterator_next_remove_while_iterating()
855857

856858
int i = 0, res = 0;
857859

858-
for (i = 0; i < num_of_keys; i++) {
860+
for (i = 0; i < 3; i++) {
859861
int res = kv_set(keys[i], data, data_size, 0);
860862
TEST_ASSERT_EQUAL_ERROR_CODE(MBED_SUCCESS, res);
861863
}

features/storage/kvstore/tdbstore/TDBStore.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ TDBStore::~TDBStore()
148148

149149
int TDBStore::read_area(uint8_t area, uint32_t offset, uint32_t size, void *buf)
150150
{
151+
//Check that we are not crossing area boundary
152+
if (offset + size > _size) {
153+
return MBED_ERROR_READ_FAILED;
154+
}
151155
int os_ret = _buff_bd->read(buf, _area_params[area].address + offset, size);
152156

153157
if (os_ret) {
@@ -649,6 +653,15 @@ int TDBStore::set_finalize(set_handle_t handle)
649653

650654
_free_space_offset = align_up(ih->bd_curr_offset, _prog_size);
651655

656+
// Safety check: If there seems to be valid keys on the free space
657+
// we should erase one sector more, just to ensure that in case of power failure
658+
// next init() would not extend the scan phase to that section as well.
659+
os_ret = read_record(_active_area, _free_space_offset, 0, 0, 0, actual_data_size, 0,
660+
false, false, false, false, hash, flags, next_offset);
661+
if (os_ret == MBED_SUCCESS) {
662+
check_erase_before_write(_active_area, _free_space_offset, sizeof(record_header_t));
663+
}
664+
652665
end:
653666
if ((need_gc) && (ih->bd_base_offset != _master_record_offset)) {
654667
garbage_collection();
@@ -972,6 +985,7 @@ int TDBStore::increment_max_keys(void **ram_table)
972985
// Reallocate ram table with new size
973986
ram_table_entry_t *old_ram_table = (ram_table_entry_t *) _ram_table;
974987
ram_table_entry_t *new_ram_table = new ram_table_entry_t[_max_keys + 1];
988+
memset(new_ram_table, 0, sizeof(ram_table_entry_t) * (_max_keys + 1));
975989

976990
// Copy old content to new table
977991
memcpy(new_ram_table, old_ram_table, sizeof(ram_table_entry_t) * _max_keys);
@@ -1018,6 +1032,7 @@ int TDBStore::init()
10181032
_max_keys = initial_max_keys;
10191033

10201034
ram_table = new ram_table_entry_t[_max_keys];
1035+
memset(ram_table, 0, sizeof(ram_table_entry_t) * _max_keys);
10211036
_ram_table = ram_table;
10221037
_num_keys = 0;
10231038

@@ -1211,7 +1226,7 @@ int TDBStore::reset()
12111226
_num_keys = 0;
12121227
_free_space_offset = _master_record_offset;
12131228
_active_area_version = 1;
1214-
1229+
memset(_ram_table, 0, sizeof(ram_table_entry_t) * _max_keys);
12151230
// Write an initial master record on active area
12161231
ret = write_master_record(_active_area, _active_area_version, _free_space_offset);
12171232

features/storage/kvstore/tdbstore/TDBStore.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ class TDBStore : public KVStore {
365365
*
366366
* @param[in] area Area.
367367
* @param[in] offset Offset of record in area.
368-
* @param[in] key Key - must not include '*' '/' '?' ':' ';' '\' '"' '|' ' ' '<' '>' '\'.
369-
* @param[in] data_buf Data buffer.
368+
* @param[out] key Key - must not include '*' '/' '?' ':' ';' '\' '"' '|' ' ' '<' '>' '\'.
369+
* @param[out] data_buf Data buffer.
370370
* @param[in] data_buf_size Data buffer size.
371371
* @param[out] actual_data_size Actual data size.
372372
* @param[in] data_offset Offset in data.

0 commit comments

Comments
 (0)