1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-13 05:06:30 +04:00

mf desfire: fix incorrect long files reading

This commit is contained in:
gornekich
2024-04-25 18:13:52 +01:00
parent c87683596a
commit e5f9af3b43

View File

@@ -75,10 +75,10 @@ MfDesfireError mf_desfire_send_chunks(
const size_t rx_capacity_remaining =
bit_buffer_get_capacity_bytes(rx_buffer) - bit_buffer_get_size_bytes(rx_buffer);
if(rx_size <= rx_capacity_remaining) {
if(rx_size - 1 <= rx_capacity_remaining) {
bit_buffer_append_right(rx_buffer, instance->rx_buffer, sizeof(uint8_t));
} else {
FURI_LOG_W(TAG, "RX buffer overflow: ignoring %zu bytes", rx_size);
FURI_LOG_W(TAG, "RX buffer overflow: ignoring %zu bytes", rx_size - 1);
}
}
} while(false);
@@ -336,23 +336,40 @@ MfDesfireError mf_desfire_poller_read_file_data(
furi_check(instance);
furi_check(data);
bit_buffer_reset(instance->input_buffer);
bit_buffer_append_byte(instance->input_buffer, MF_DESFIRE_CMD_READ_DATA);
bit_buffer_append_byte(instance->input_buffer, id);
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&offset, 3);
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&size, 3);
MfDesfireError error = MfDesfireErrorNone;
simple_array_init(data->data, size);
MfDesfireError error;
size_t buffer_capacity = bit_buffer_get_capacity_bytes(instance->result_buffer);
uint32_t current_offset = offset;
uint32_t bytes_read = 0;
while(bytes_read < size) {
size_t bytes_to_read = MIN(buffer_capacity, size - bytes_read);
bit_buffer_reset(instance->input_buffer);
bit_buffer_append_byte(instance->input_buffer, MF_DESFIRE_CMD_READ_DATA);
bit_buffer_append_byte(instance->input_buffer, id);
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&current_offset, 3);
bit_buffer_append_bytes(instance->input_buffer, (const uint8_t*)&bytes_to_read, 3);
do {
error = mf_desfire_send_chunks(instance, instance->input_buffer, instance->result_buffer);
if(error != MfDesfireErrorNone) break;
if(!mf_desfire_file_data_parse(data, instance->result_buffer)) {
size_t bytes_received = bit_buffer_get_size_bytes(instance->result_buffer);
if(bytes_received != bytes_to_read) {
FURI_LOG_W(TAG, "Read %zu out of %zu bytes", bytes_received, bytes_to_read);
error = MfDesfireErrorProtocol;
break;
}
} while(false);
uint8_t* file_data = simple_array_get_data(data->data);
bit_buffer_write_bytes(instance->result_buffer, &file_data[current_offset], bytes_to_read);
bytes_read += bytes_to_read;
current_offset += bytes_to_read;
}
if(error != MfDesfireErrorNone) {
simple_array_reset(data->data);
}
return error;
}