From a2100843b9cfeb45d37d91e6a2331afbf28d76f3 Mon Sep 17 00:00:00 2001 From: Janice McLaughlin Date: Tue, 25 Sep 2018 20:03:18 +0200 Subject: [PATCH] Remove extra padding from the end of the profile Even after removing the pages padded with 0xFF bytes, there are still some invalid sample pages present at the end of the profile. But it turns out the number of valid profile pages is stored in the logbook entry. The only caveat is that the number of pages appears to be stored as a 12 bit number, which limits the total profile size to only 64Kb. We don't known what happens for larger dives. --- src/oceanic_common.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/oceanic_common.c b/src/oceanic_common.c index 908896c..184e5f9 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -496,9 +496,13 @@ oceanic_common_device_profile (dc_device_t *abstract, dc_event_progress_t *progr // Remove padding from the profile. if (layout->highmem) { - unsigned char *profile = profiles + offset + layout->rb_logbook_entry_size; - while (rb_entry_size >= PAGESIZE && array_isequal (profile + rb_entry_size - PAGESIZE, PAGESIZE, 0xFF)) { - rb_entry_size -= PAGESIZE; + // The logbook entry contains the total number of pages containing + // profile data, excluding the footer page. Limit the profile size + // to this size. + unsigned int npages = (array_uint16_le (profiles + offset + 12) & 0x0FFF) + 1; + unsigned int length = npages * PAGESIZE; + if (rb_entry_size > length) { + rb_entry_size = length; } }