@@ -77,7 +77,7 @@ typedef struct {
77
77
uint32_t crc;
78
78
} reserved_trailer_t ;
79
79
80
- static const uint32_t work_buf_size = 64 ;
80
+ static const size_t min_work_buf_size = 64 ;
81
81
static const uint32_t initial_crc = 0xFFFFFFFF ;
82
82
static const uint32_t initial_max_keys = 16 ;
83
83
@@ -130,7 +130,7 @@ static uint32_t calc_crc(uint32_t init_crc, uint32_t data_size, const void *data
130
130
TDBStore::TDBStore (BlockDevice *bd) : _ram_table(0 ), _max_keys(0 ),
131
131
_num_keys(0 ), _bd(bd), _buff_bd(0 ), _free_space_offset(0 ), _master_record_offset(0 ),
132
132
_master_record_size(0 ), _is_initialized(false ), _active_area(0 ), _active_area_version(0 ), _size(0 ),
133
- _area_params{}, _prog_size(0 ), _work_buf(0 ), _key_buf(0 ), _inc_set_handle(0 )
133
+ _area_params{}, _prog_size(0 ), _work_buf(0 ), _work_buf_size( 0 ), _key_buf(0 ), _inc_set_handle(0 )
134
134
{
135
135
for (int i = 0 ; i < _num_areas; i++) {
136
136
_area_params[i] = { 0 };
@@ -196,7 +196,7 @@ int TDBStore::erase_erase_unit(uint8_t area, uint32_t offset)
196
196
void TDBStore::calc_area_params ()
197
197
{
198
198
// TDBStore can't exceed 32 bits
199
- bd_size_t bd_size = std::min (_bd->size (), ( bd_size_t ) 0x80000000L );
199
+ bd_size_t bd_size = std::min< bd_size_t > (_bd->size (), 0x80000000L );
200
200
201
201
memset (_area_params, 0 , sizeof (_area_params));
202
202
size_t area_0_size = 0 ;
@@ -293,7 +293,7 @@ int TDBStore::read_record(uint8_t area, uint32_t offset, char *key,
293
293
return MBED_ERROR_INVALID_SIZE;
294
294
}
295
295
296
- actual_data_size = std::min (( size_t ) data_buf_size, ( size_t ) data_size - data_offset);
296
+ actual_data_size = std::min< size_t >( data_buf_size, data_size - data_offset);
297
297
298
298
if (copy_data && actual_data_size && !data_buf) {
299
299
return MBED_ERROR_INVALID_ARGUMENT;
@@ -327,7 +327,7 @@ int TDBStore::read_record(uint8_t area, uint32_t offset, char *key,
327
327
user_key_ptr[key_size] = ' \0 ' ;
328
328
} else {
329
329
dest_buf = _work_buf;
330
- chunk_size = std::min (key_size, work_buf_size );
330
+ chunk_size = std::min< size_t > (key_size, _work_buf_size );
331
331
}
332
332
} else {
333
333
// This means that we're on the data part
@@ -337,13 +337,13 @@ int TDBStore::read_record(uint8_t area, uint32_t offset, char *key,
337
337
// 3. After actual part is finished - read to work buffer
338
338
// 4. Copy data flag not set - read to work buffer
339
339
if (curr_data_offset < data_offset) {
340
- chunk_size = std::min (( size_t )work_buf_size, ( size_t ) (data_offset - curr_data_offset));
340
+ chunk_size = std::min< size_t >(_work_buf_size, (data_offset - curr_data_offset));
341
341
dest_buf = _work_buf;
342
342
} else if (copy_data && (curr_data_offset < data_offset + actual_data_size)) {
343
343
chunk_size = actual_data_size;
344
344
dest_buf = static_cast <uint8_t *>(data_buf);
345
345
} else {
346
- chunk_size = std::min (work_buf_size , total_size);
346
+ chunk_size = std::min< size_t >(_work_buf_size , total_size);
347
347
dest_buf = _work_buf;
348
348
}
349
349
}
@@ -847,7 +847,10 @@ int TDBStore::copy_record(uint8_t from_area, uint32_t from_offset, uint32_t to_o
847
847
}
848
848
849
849
chunk_size = align_up (sizeof (record_header_t ), _prog_size);
850
- ret = write_area (1 - from_area, to_offset, chunk_size, &header);
850
+ // The record header takes up whole program units
851
+ memset (_work_buf, 0 , chunk_size);
852
+ memcpy (_work_buf, &header, sizeof (record_header_t ));
853
+ ret = write_area (1 - from_area, to_offset, chunk_size, _work_buf);
851
854
if (ret) {
852
855
return ret;
853
856
}
@@ -857,7 +860,7 @@ int TDBStore::copy_record(uint8_t from_area, uint32_t from_offset, uint32_t to_o
857
860
total_size -= chunk_size;
858
861
859
862
while (total_size) {
860
- chunk_size = std::min (total_size, work_buf_size );
863
+ chunk_size = std::min< size_t > (total_size, _work_buf_size );
861
864
ret = read_area (from_area, from_offset, chunk_size, _work_buf);
862
865
if (ret) {
863
866
return ret;
@@ -1041,7 +1044,8 @@ int TDBStore::init()
1041
1044
}
1042
1045
1043
1046
_prog_size = _bd->get_program_size ();
1044
- _work_buf = new uint8_t [work_buf_size];
1047
+ _work_buf_size = std::max<size_t >(_prog_size, min_work_buf_size);
1048
+ _work_buf = new uint8_t [_work_buf_size];
1045
1049
_key_buf = new char [MAX_KEY_SIZE];
1046
1050
_inc_set_handle = new inc_set_handle_t ;
1047
1051
memset (_inc_set_handle, 0 , sizeof (inc_set_handle_t ));
0 commit comments