Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FL-3817] iButton: fix crash when deleting some keys #3617

Merged
merged 4 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 3 additions & 7 deletions lib/ibutton/protocols/dallas/protocol_ds1971.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,19 +218,15 @@ void dallas_ds1971_render_uid(FuriString* result, const iButtonProtocolData* pro

void dallas_ds1971_render_data(FuriString* result, const iButtonProtocolData* protocol_data) {
const DS1971ProtocolData* data = protocol_data;
FuriString* data_string = furi_string_alloc();

furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");

pretty_format_bytes_hex_canonical(
data_string,
result,
DS1971_DATA_BYTE_COUNT,
PRETTY_FORMAT_FONT_MONOSPACE,
data->eeprom_data,
DS1971_EEPROM_DATA_SIZE);

furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");
furi_string_cat_printf(result, "%s", furi_string_get_cstr(data_string));

furi_string_free(data_string);
}

void dallas_ds1971_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) {
Expand Down
10 changes: 3 additions & 7 deletions lib/ibutton/protocols/dallas/protocol_ds1992.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,19 +191,15 @@ void dallas_ds1992_render_uid(FuriString* result, const iButtonProtocolData* pro

void dallas_ds1992_render_data(FuriString* result, const iButtonProtocolData* protocol_data) {
const DS1992ProtocolData* data = protocol_data;
FuriString* data_string = furi_string_alloc();

furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");

pretty_format_bytes_hex_canonical(
data_string,
result,
DS1992_DATA_BYTE_COUNT,
PRETTY_FORMAT_FONT_MONOSPACE,
data->sram_data,
DS1992_SRAM_DATA_SIZE);

furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");
furi_string_cat_printf(result, "%s", furi_string_get_cstr(data_string));

furi_string_free(data_string);
}

void dallas_ds1992_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) {
Expand Down
9 changes: 2 additions & 7 deletions lib/ibutton/protocols/dallas/protocol_ds1996.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,19 +217,14 @@ void dallas_ds1996_render_uid(FuriString* result, const iButtonProtocolData* pro
void dallas_ds1996_render_data(FuriString* result, const iButtonProtocolData* protocol_data) {
const DS1996ProtocolData* data = protocol_data;

FuriString* data_string = furi_string_alloc();
furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");

pretty_format_bytes_hex_canonical(
data_string,
result,
DS1996_DATA_BYTE_COUNT,
PRETTY_FORMAT_FONT_MONOSPACE,
data->sram_data,
DS1996_SRAM_DATA_SIZE);

furi_string_cat_printf(result, "\e#Memory Data\n--------------------\n");
furi_string_cat_printf(result, "%s", furi_string_get_cstr(data_string));

furi_string_free(data_string);
}

void dallas_ds1996_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) {
Expand Down
7 changes: 2 additions & 5 deletions lib/ibutton/protocols/misc/protocol_cyfral.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,18 +325,15 @@ static LevelDuration protocol_cyfral_encoder_yield(ProtocolCyfral* proto) {
return result;
}

static void protocol_cyfral_render_uid(FuriString* result, ProtocolCyfral* proto) {
static void protocol_cyfral_render_uid(ProtocolCyfral* proto, FuriString* result) {
furi_string_cat_printf(result, "ID: ");
for(size_t i = 0; i < CYFRAL_DATA_SIZE; ++i) {
furi_string_cat_printf(result, "%02X ", ((uint8_t*)&proto->data)[i]);
}
}

static void protocol_cyfral_render_brief_data(ProtocolCyfral* proto, FuriString* result) {
furi_string_cat_printf(result, "ID: ");
for(size_t i = 0; i < CYFRAL_DATA_SIZE; ++i) {
furi_string_cat_printf(result, "%02X ", ((uint8_t*)&proto->data)[i]);
}
protocol_cyfral_render_uid(proto, result);
}

const ProtocolBase ibutton_protocol_misc_cyfral = {
Expand Down
11 changes: 11 additions & 0 deletions lib/ibutton/protocols/misc/protocol_group_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,16 @@ static bool ibutton_protocol_group_misc_load(
}
}

static void ibutton_protocol_group_misc_render_uid(
iButtonProtocolGroupMisc* group,
const iButtonProtocolData* data,
iButtonProtocolLocalId id,
FuriString* result) {
const size_t data_size = protocol_dict_get_data_size(group->dict, id);
protocol_dict_set_data(group->dict, id, data, data_size);
protocol_dict_render_uid(group->dict, result, id);
}

static void ibutton_protocol_group_misc_render_data(
iButtonProtocolGroupMisc* group,
const iButtonProtocolData* data,
Expand Down Expand Up @@ -283,6 +293,7 @@ const iButtonProtocolGroupBase ibutton_protocol_group_misc = {
.save = (iButtonProtocolGroupSaveFunc)ibutton_protocol_group_misc_save,
.load = (iButtonProtocolGroupLoadFunc)ibutton_protocol_group_misc_load,

.render_uid = (iButtonProtocolGroupRenderFunc)ibutton_protocol_group_misc_render_uid,
.render_data = (iButtonProtocolGroupRenderFunc)ibutton_protocol_group_misc_render_data,
.render_brief_data =
(iButtonProtocolGroupRenderFunc)ibutton_protocol_group_misc_render_brief_data,
Expand Down
3 changes: 1 addition & 2 deletions lib/toolbox/pretty_format.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ void pretty_format_bytes_hex_canonical(
const size_t line_length = (line_prefix ? strlen(line_prefix) : 0) + 4 * num_places + 2;

/* Reserve memory in adance in order to avoid unnecessary reallocs */
furi_string_reset(result);
furi_string_reserve(result, line_count * line_length);
furi_string_reserve(result, furi_string_size(result) + line_count * line_length);

for(size_t i = 0; i < data_size; i += num_places) {
if(line_prefix) {
Expand Down
13 changes: 11 additions & 2 deletions lib/toolbox/protocols/protocol_dict.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,12 +198,21 @@ LevelDuration protocol_dict_encoder_yield(ProtocolDict* dict, size_t protocol_in
}
}

void protocol_dict_render_uid(ProtocolDict* dict, FuriString* result, size_t protocol_index) {
furi_check(protocol_index < dict->count);
ProtocolRenderData fn = dict->base[protocol_index]->render_uid;

if(fn) {
fn(dict->data[protocol_index], result);
}
}

void protocol_dict_render_data(ProtocolDict* dict, FuriString* result, size_t protocol_index) {
furi_check(protocol_index < dict->count);
ProtocolRenderData fn = dict->base[protocol_index]->render_data;

if(fn) {
return fn(dict->data[protocol_index], result);
fn(dict->data[protocol_index], result);
}
}

Expand All @@ -212,7 +221,7 @@ void protocol_dict_render_brief_data(ProtocolDict* dict, FuriString* result, siz
ProtocolRenderData fn = dict->base[protocol_index]->render_brief_data;

if(fn) {
return fn(dict->data[protocol_index], result);
fn(dict->data[protocol_index], result);
}
}

Expand Down
2 changes: 2 additions & 0 deletions lib/toolbox/protocols/protocol_dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ bool protocol_dict_encoder_start(ProtocolDict* dict, size_t protocol_index);

LevelDuration protocol_dict_encoder_yield(ProtocolDict* dict, size_t protocol_index);

void protocol_dict_render_uid(ProtocolDict* dict, FuriString* result, size_t protocol_index);

void protocol_dict_render_data(ProtocolDict* dict, FuriString* result, size_t protocol_index);

void protocol_dict_render_brief_data(ProtocolDict* dict, FuriString* result, size_t protocol_index);
Expand Down
3 changes: 2 additions & 1 deletion targets/f18/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,61.1,,
Version,+,61.2,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.h,,
Expand Down Expand Up @@ -2251,6 +2251,7 @@ Function,+,protocol_dict_get_validate_count,uint32_t,"ProtocolDict*, size_t"
Function,+,protocol_dict_get_write_data,_Bool,"ProtocolDict*, size_t, void*"
Function,+,protocol_dict_render_brief_data,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
Function,-,pulse_reader_free,void,PulseReader*
Expand Down
3 changes: 2 additions & 1 deletion targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,61.1,,
Version,+,61.2,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Expand Down Expand Up @@ -2849,6 +2849,7 @@ Function,+,protocol_dict_get_validate_count,uint32_t,"ProtocolDict*, size_t"
Function,+,protocol_dict_get_write_data,_Bool,"ProtocolDict*, size_t, void*"
Function,+,protocol_dict_render_brief_data,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_render_uid,void,"ProtocolDict*, FuriString*, size_t"
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
Function,-,pulse_reader_free,void,PulseReader*
Expand Down