From 0e913f2a8f0adc2f69c85fdcc1a2077928e6f810 Mon Sep 17 00:00:00 2001
From: James Talbert <jtalbert@iastate.edu>
Date: Fri, 3 May 2019 16:24:34 -0500
Subject: [PATCH] Fix memory leak

---
 quad/src/quad_app/callbacks.c | 45 ++++++++--------
 quad/src/quad_app/log_data.c  | 97 ++++++++++++++++-------------------
 quad/src/quad_app/log_data.h  |  1 +
 quad/src/quad_app/type_def.h  |  8 +--
 4 files changed, 73 insertions(+), 78 deletions(-)

diff --git a/quad/src/quad_app/callbacks.c b/quad/src/quad_app/callbacks.c
index eccc1f8fe..2a51f351e 100644
--- a/quad/src/quad_app/callbacks.c
+++ b/quad/src/quad_app/callbacks.c
@@ -448,6 +448,7 @@ int cb_overrideoutput(struct modular_structs *structs, struct metadata *meta, un
 		float f = build_float(&data[1+i*4]);
 		override_info->values[i] = f;
 	}
+	return 0;
 }
 
 int cb_sendrtdata(struct modular_structs *structs, struct metadata *meta, unsigned char *data, unsigned short length) {
@@ -456,32 +457,32 @@ int cb_sendrtdata(struct modular_structs *structs, struct metadata *meta, unsign
 		return -1;
 	int size = 0;
     u32 configData = (data[2] << 24) | (data[3] << 16) | (data[4] << 8) | (data[5]);
-    structs->flags_struct.lidarflags->quadHeight = read_bit(configData, 31); size += read_bit(configData, 31);
+    structs->flags_struct.lidarflags.quadHeight = read_bit(configData, 31); size += read_bit(configData, 31);
 	/*BEGIN DOUBLE-TYPE FLAGS. If these are enabled, actual size of data sent is 2*read_bit due to
 	* length of data. This needs to be compensated for in methods where total length of payload packet
 	* needs to be known ahead of time. */
-    structs->flags_struct.optflowflags->x_flow = read_bit(configData, 30); size += read_bit(configData, 30); 
-    structs->flags_struct.optflowflags->y_flow = read_bit(configData, 29); size += read_bit(configData, 29); 
-    structs->flags_struct.optflowflags->x_filter = read_bit(configData, 28); size += read_bit(configData, 28); 
-    structs->flags_struct.optflowflags->y_filter = read_bit(configData, 27); size += read_bit(configData, 27); 
-    structs->flags_struct.optflowflags->x_velocity = read_bit(configData, 26); size += read_bit(configData, 26); 
-    structs->flags_struct.optflowflags->y_velocity = read_bit(configData, 25); size += read_bit(configData, 25);
+    structs->flags_struct.optflowflags.x_flow = read_bit(configData, 30); size += read_bit(configData, 30); 
+    structs->flags_struct.optflowflags.y_flow = read_bit(configData, 29); size += read_bit(configData, 29); 
+    structs->flags_struct.optflowflags.x_filter = read_bit(configData, 28); size += read_bit(configData, 28); 
+    structs->flags_struct.optflowflags.y_filter = read_bit(configData, 27); size += read_bit(configData, 27); 
+    structs->flags_struct.optflowflags.x_velocity = read_bit(configData, 26); size += read_bit(configData, 26); 
+    structs->flags_struct.optflowflags.y_velocity = read_bit(configData, 25); size += read_bit(configData, 25);
 	//END DOUBLE TYPE FLAGS. 
-    structs->flags_struct.imuflags->gyro_x = read_bit(configData, 24); size += read_bit(configData, 24); 
-    structs->flags_struct.imuflags->gyro_y = read_bit(configData, 23); size += read_bit(configData, 23); 
-    structs->flags_struct.imuflags->gyro_z = read_bit(configData, 22); size += read_bit(configData, 22); 
-    structs->flags_struct.imuflags->acc_x = read_bit(configData, 21); size += read_bit(configData, 21); 
-    structs->flags_struct.imuflags->acc_y = read_bit(configData, 20); size += read_bit(configData, 20); 
-    structs->flags_struct.imuflags->acc_z = read_bit(configData, 19); size += read_bit(configData, 19); 
-    structs->flags_struct.imuflags->mag_x = read_bit(configData, 18); size += read_bit(configData, 18); 
-    structs->flags_struct.imuflags->mag_y = read_bit(configData, 17); size += read_bit(configData, 17); 
-    structs->flags_struct.imuflags->mag_z = read_bit(configData, 16); size += read_bit(configData, 16); 
-    structs->flags_struct.errorflags->lidar = read_bit(configData, 15); size += read_bit(configData, 15); 
-    structs->flags_struct.errorflags->consec_lidar = read_bit(configData, 14); size += read_bit(configData, 14); 
-    structs->flags_struct.errorflags->optFlow = read_bit(configData, 13); size += read_bit(configData, 13); 
-    structs->flags_struct.errorflags->consec_optFlow = read_bit(configData, 12); size += read_bit(configData, 12); 
-    structs->flags_struct.errorflags->imu = read_bit(configData, 11); size += read_bit(configData, 11); 
-    structs->flags_struct.errorflags->consec_imu = read_bit(configData, 10); size += read_bit(configData, 10);
+    structs->flags_struct.imuflags.gyro_x = read_bit(configData, 24); size += read_bit(configData, 24); 
+    structs->flags_struct.imuflags.gyro_y = read_bit(configData, 23); size += read_bit(configData, 23); 
+    structs->flags_struct.imuflags.gyro_z = read_bit(configData, 22); size += read_bit(configData, 22); 
+    structs->flags_struct.imuflags.acc_x = read_bit(configData, 21); size += read_bit(configData, 21); 
+    structs->flags_struct.imuflags.acc_y = read_bit(configData, 20); size += read_bit(configData, 20); 
+    structs->flags_struct.imuflags.acc_z = read_bit(configData, 19); size += read_bit(configData, 19); 
+    structs->flags_struct.imuflags.mag_x = read_bit(configData, 18); size += read_bit(configData, 18); 
+    structs->flags_struct.imuflags.mag_y = read_bit(configData, 17); size += read_bit(configData, 17); 
+    structs->flags_struct.imuflags.mag_z = read_bit(configData, 16); size += read_bit(configData, 16); 
+    structs->flags_struct.errorflags.lidar = read_bit(configData, 15); size += read_bit(configData, 15); 
+    structs->flags_struct.errorflags.consec_lidar = read_bit(configData, 14); size += read_bit(configData, 14); 
+    structs->flags_struct.errorflags.optFlow = read_bit(configData, 13); size += read_bit(configData, 13); 
+    structs->flags_struct.errorflags.consec_optFlow = read_bit(configData, 12); size += read_bit(configData, 12); 
+    structs->flags_struct.errorflags.imu = read_bit(configData, 11); size += read_bit(configData, 11); 
+    structs->flags_struct.errorflags.consec_imu = read_bit(configData, 10); size += read_bit(configData, 10);
     structs->flags_struct.flag_count = size;
 	return 0;
 }
diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c
index fe8aef14d..da7cc4681 100644
--- a/quad/src/quad_app/log_data.c
+++ b/quad/src/quad_app/log_data.c
@@ -138,39 +138,39 @@ void initialize_logging(log_t* log_struct, parameter_t* ps, SensorRTFlags_t * fl
 	addParamToLog(log_struct, ps->flow_quality, CONST_VAL, "none");
 
 	int num_outputs = 0;
-	if (flags->imuflags->acc_x)
+	if (flags->imuflags.acc_x)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->acc_y)
+	if (flags->imuflags.acc_y)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->acc_z)
+	if (flags->imuflags.acc_z)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->gyro_x)
+	if (flags->imuflags.gyro_x)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->gyro_y)
+	if (flags->imuflags.gyro_y)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->gyro_z)
+	if (flags->imuflags.gyro_z)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->mag_x)
+	if (flags->imuflags.mag_x)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->mag_y)
+	if (flags->imuflags.mag_y)
 	{
 		num_outputs++;
 	}
-	if (flags->imuflags->mag_z)
+	if (flags->imuflags.mag_z)
 	{
 		num_outputs++;
 	}
@@ -197,39 +197,39 @@ int log_data(log_t* log_struct, parameter_t* ps, SensorRTFlags_t * flags)
 
 	//TODO make this not stupid
 	thisRow[offset++] = log_struct->time_stamp;
-	if (flags->imuflags->acc_x)
+	if (flags->imuflags.acc_x)
 	{
 		thisRow[offset++] = log_struct->gam.accel_x;
 	}
-	if (flags->imuflags->acc_y)
+	if (flags->imuflags.acc_y)
 	{
 		thisRow[offset++] = log_struct->gam.accel_y;
 	}
-	if (flags->imuflags->acc_z)
+	if (flags->imuflags.acc_z)
 	{
 		thisRow[offset++] = log_struct->gam.accel_z;
 	}
-	if (flags->imuflags->gyro_x)
+	if (flags->imuflags.gyro_x)
 	{
 		thisRow[offset++] = log_struct->gam.gyro_xVel_p;
 	}
-	if (flags->imuflags->gyro_y)
+	if (flags->imuflags.gyro_y)
 	{
 		thisRow[offset++] = log_struct->gam.gyro_yVel_q;
 	}
-	if (flags->imuflags->gyro_z)
+	if (flags->imuflags.gyro_z)
 	{
 		thisRow[offset++] = log_struct->gam.gyro_zVel_r;
 	}
-	if (flags->imuflags->mag_x)
+	if (flags->imuflags.mag_x)
 	{
 		thisRow[offset++] = log_struct->gam.mag_x;
 	}
-	if (flags->imuflags->mag_y)
+	if (flags->imuflags.mag_y)
 	{
 		thisRow[offset++] = log_struct->gam.mag_y;
 	}
-	if (flags->imuflags->mag_z)
+	if (flags->imuflags.mag_z)
 	{
 		thisRow[offset++] = log_struct->gam.mag_z;
 	}
@@ -286,39 +286,39 @@ void RTprintheader(struct CommDriver *comm, log_t* log_struct, parameter_t* ps,
 
 	// TODO make this not stupid
 	safe_sprintf_cat(&buf, "%%Time");
-	if (flags->imuflags->acc_x)
+	if (flags->imuflags.acc_x)
 	{
 		safe_sprintf_cat(&buf, "\taccel_x");
 	}
-	if (flags->imuflags->acc_y)
+	if (flags->imuflags.acc_y)
 	{
 		safe_sprintf_cat(&buf, "\taccel_y");
 	}
-	if (flags->imuflags->acc_z)
+	if (flags->imuflags.acc_z)
 	{
 		safe_sprintf_cat(&buf, "\taccel_z");
 	}
-	if (flags->imuflags->gyro_x)
+	if (flags->imuflags.gyro_x)
 	{
 		safe_sprintf_cat(&buf, "\tgyro_x");
 	}
-	if (flags->imuflags->gyro_y)
+	if (flags->imuflags.gyro_y)
 	{
 		safe_sprintf_cat(&buf, "\tgyro_y");
 	}
-	if (flags->imuflags->gyro_z)
+	if (flags->imuflags.gyro_z)
 	{
 		safe_sprintf_cat(&buf, "\tgyro_z");
 	}
-	if (flags->imuflags->mag_x)
+	if (flags->imuflags.mag_x)
 	{
 		safe_sprintf_cat(&buf, "\tmag_x");
 	}
-	if (flags->imuflags->mag_y)
+	if (flags->imuflags.mag_y)
 	{
 		safe_sprintf_cat(&buf, "\tmag_y_x");
 	}
-	if (flags->imuflags->mag_z)
+	if (flags->imuflags.mag_z)
 	{
 		safe_sprintf_cat(&buf, "\tmag_z");
 	}
@@ -344,39 +344,39 @@ void RTprintheader(struct CommDriver *comm, log_t* log_struct, parameter_t* ps,
 	buf.size = 0;
 
 	safe_sprintf_cat(&buf, "&s"); // The pre-defined ones
-	if (flags->imuflags->acc_x)
+	if (flags->imuflags.acc_x)
 	{
 		safe_sprintf_cat(&buf, "\tG");
 	}
-	if (flags->imuflags->acc_y)
+	if (flags->imuflags.acc_y)
 	{
 		safe_sprintf_cat(&buf, "\tG");
 	}
-	if (flags->imuflags->acc_z)
+	if (flags->imuflags.acc_z)
 	{
 		safe_sprintf_cat(&buf, "\tG");
 	}
-	if (flags->imuflags->gyro_x)
+	if (flags->imuflags.gyro_x)
 	{
 		safe_sprintf_cat(&buf, "\trad/s");
 	}
-	if (flags->imuflags->gyro_y)
+	if (flags->imuflags.gyro_y)
 	{
 		safe_sprintf_cat(&buf, "\trad/s");
 	}
-	if (flags->imuflags->gyro_z)
+	if (flags->imuflags.gyro_z)
 	{
 		safe_sprintf_cat(&buf, "\trad/s");
 	}
-	if (flags->imuflags->mag_x)
+	if (flags->imuflags.mag_x)
 	{
 		safe_sprintf_cat(&buf, "\tuT");
 	}
-	if (flags->imuflags->mag_y)
+	if (flags->imuflags.mag_y)
 	{
 		safe_sprintf_cat(&buf, "\tuT");
 	}
-	if (flags->imuflags->mag_z)
+	if (flags->imuflags.mag_z)
 	{
 		safe_sprintf_cat(&buf, "\tuT");
 	}
@@ -529,20 +529,13 @@ void format_log(int idx, log_t* log_struct, struct str* buf) {
     Initially sets it so that all debug values are zero
 */
 void initializeFlags(SensorRTFlags_t * flags) {
-
-    flags = calloc(1, sizeof(SensorRTFlags_t));
-    flags -> imuflags = calloc(1, sizeof(IMUFlags_t));
-    flags -> optflowflags = calloc(1, sizeof(OptFlowFlags_t));
-    flags -> lidarflags = calloc(1, sizeof(lidarFlags_t));
-    flags -> errorflags = calloc(1, sizeof(SensorErrorFlags_t));
-    flags -> flag_count = 0;
-}
-
-void freeFlags(SensorRTFlags_t * flags){
-    free(flags -> imuflags);
-    free(flags -> optflowflags); 
-    free(flags -> lidarflags);
-    free(flags -> errorflags);
-    free(flags -> flag_count);
-    free(flags);
+  IMUFlags_t imu = {0,0,0, 0,0,0, 0,0,0};
+  flags->imuflags = imu;
+  OptFlowFlags_t optf = {0,0, 0,0, 0,0};
+  flags->optflowflags = optf;
+  lidarFlags_t lidar = {0};
+  flags->lidarflags = lidar;
+  SensorErrorFlags_t se = {0,0,0, 0,0,0};
+  flags->errorflags = se;
+  flags->flag_count = 0;
 }
diff --git a/quad/src/quad_app/log_data.h b/quad/src/quad_app/log_data.h
index b72717524..a34e98177 100644
--- a/quad/src/quad_app/log_data.h
+++ b/quad/src/quad_app/log_data.h
@@ -15,6 +15,7 @@
 
 void initialize_logging(log_t* log_struct, parameter_t* ps, SensorRTFlags_t * flags);
 
+void initializeFlags(SensorRTFlags_t * flags); 
 /**
  * Adds the given block output to the data to be logged
  */
diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h
index 8ffcea2c6..4f667b879 100644
--- a/quad/src/quad_app/type_def.h
+++ b/quad/src/quad_app/type_def.h
@@ -535,10 +535,10 @@ typedef struct SensorErrorFlags
 */
 typedef struct SensorRTFlags
 {
-    IMUFlags_t * imuflags;
-    OptFlowFlags_t * optflowflags;
-    lidarFlags_t * lidarflags;
-    SensorErrorFlags_t * errorflags;
+    IMUFlags_t imuflags;
+    OptFlowFlags_t optflowflags;
+    lidarFlags_t lidarflags;
+    SensorErrorFlags_t errorflags;
     int flag_count;
     
 } SensorRTFlags_t;
-- 
GitLab