[PATCH 2/6] Cochran code: - fixed bug where last dive was not completed downloaded resulting in a bad dive profile - fixed bug where malloc result wasn't verified - removed unnecesary cast - minor code formatting and comment changes.

John Van Ostrand john at vanostrand.com
Mon Jan 11 07:22:54 PST 2016


---
 src/cochran_commander.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/cochran_commander.c b/src/cochran_commander.c
index 3ba3786..8bb61c9 100644
--- a/src/cochran_commander.c
+++ b/src/cochran_commander.c
@@ -22,6 +22,7 @@
 #include <string.h> // memcpy, memcmp
 #include <stdlib.h> // malloc, free
 #include <assert.h> // assert
+#include <stdio.h>  // DEBUG JVO
 
 #include <libdivecomputer/cochran.h>
 
@@ -632,7 +633,7 @@ cochran_get_sample_parms(dc_device_t *abstract)
 		pre_dive_offset = array_uint32_le (&(d->logbook[i * layout->rb_log_size
 				+ layout->pt_log_profile_pre]));
 		end_dive_offset = array_uint32_le (&(d->logbook[i * layout->rb_log_size
-				+ layout->pt_log_profile_begin]));
+				+ layout->pt_log_profile_end]));
 
 		// Check for ring buffer wrap-around.
 		if (pre_dive_offset > end_dive_offset)
@@ -678,7 +679,7 @@ cochran_read_samples(dc_device_t *abstract, dc_event_progress_t *progress)
 			free(d->sample);
 
 		d->sample = (unsigned char *) malloc(d->sample_size);
-		if (device == NULL) {
+		if (d->sample == NULL) {
 			ERROR (abstract->context, "Failed to allocate memory.");
 			return DC_STATUS_NOMEMORY;
 		}
@@ -864,7 +865,7 @@ cochran_commander_device_foreach (dc_device_t *abstract,
 	dc_status_t rc;
 
 	unsigned char *log, *fingerprint, *sample, *dive;
-	int sample_size, dive_size;
+	unsigned int sample_size, dive_size;
 
 	rc = cochran_commander_device_read_all (abstract);
 
@@ -896,27 +897,27 @@ cochran_commander_device_foreach (dc_device_t *abstract,
 
 		// Build dive blob
 		dive_size = COCHRAN_MODEL_SIZE + layout->rb_log_size + sample_size;
-		dive = malloc(dive_size);
+		dive = (unsigned char *) malloc(dive_size);
 		if (dive == NULL)
 			return DC_STATUS_NOMEMORY;
 
 		memcpy(dive, data->id + 0x3B, 8);       // model string
-		memcpy(dive + COCHRAN_MODEL_SIZE, log, layout->rb_log_size);
+		memcpy(dive + COCHRAN_MODEL_SIZE, log, layout->rb_log_size); // log
 
+		// Copy profile data
 		if (sample_start_address <= sample_end_address) {
 			memcpy(dive + COCHRAN_MODEL_SIZE + layout->rb_log_size, sample,
 				sample_size);
 		} else {
 			// It wrapped the buffer, copy two sections
-			unsigned int size = layout->rb_profile_end
-				- sample_start_address;
+			unsigned int size = layout->rb_profile_end - sample_start_address;
 			memcpy(dive + COCHRAN_MODEL_SIZE + layout->rb_log_size, sample, size);
 			memcpy(dive + COCHRAN_MODEL_SIZE + layout->rb_log_size + size,
 				data->sample, sample_size - size);
 		}
 
-		if (callback && !callback ((unsigned char *) dive, dive_size,
-				fingerprint, COCHRAN_FINGERPRINT_SIZE, userdata)) {
+		if (callback && !callback (dive, dive_size, fingerprint,
+				COCHRAN_FINGERPRINT_SIZE, userdata)) {
 			free(dive);
 			return DC_STATUS_SUCCESS;
 		}
-- 
2.4.3



More information about the devel mailing list