A bit more work on TDMA;
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 13 Sep 2017 21:00:26 +0000 (21:00 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 13 Sep 2017 21:00:26 +0000 (21:00 +0000)
fixed memory leak in generate_codebook.c to allow compiliation with asan

git-svn-id: https://svn.code.sf.net/p/freetel/code@3365 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/generate_codebook.c
codec2-dev/src/tdma.c

index 835fc7ddfc8e61ea07ca83631435960fd6515bc4..e5d6f44a302e5abf128b16f03a19476e0cbb60eb 100644 (file)
@@ -174,6 +174,10 @@ main(int argc, char * * argv)
   }
   printf("  { 0, 0, 0, 0 }\n");
   printf("};\n");
-
+  for( i = 0; i < argc - 2; i++ ){
+    free(cb[i]->cb);
+    free(cb[i]);
+  }
+  free(cb);
   return 0;
 }
index 78321843715c288162207e4246ecd97f41823a7a..f4f1e647ddb06e80c141e7f45c7b7399f634cc09 100644 (file)
@@ -50,14 +50,15 @@ struct TDMA_MODEM * tdma_create(struct TDMA_MODE_SETTINGS mode){
 
     /* allocate the modem */
     tdma = (struct TDMA_MODEM *) malloc(sizeof(struct TDMA_MODEM));
-    /* TODO: Malloc NULL checks */
+    if(tdma == NULL) goto cleanup_bad_alloc;
 
     /* Symbols over which pilot modem operates */
     u32 pilot_nsyms = slot_size/2;
 
     /* Set up pilot modem */
     struct FSK * pilot = fsk_create_hbr(Fs,Rs,P,M,Rs,Rs);
-    fsk_set_nsym(pilot,pilot_nsyms);
+    if(pilot == NULL) goto cleanup_bad_alloc;
+    fsk_enable_burst_mode(pilot,pilot_nsyms);
     tdma->fsk_pilot = pilot;
     
     tdma->settings = mode;
@@ -67,13 +68,55 @@ struct TDMA_MODEM * tdma_create(struct TDMA_MODE_SETTINGS mode){
     /* Allocate buffer for incoming samples */
     /* TODO: We may only need a single slot's worth of samps -- look into this */
     COMP * samp_buffer = (COMP *) malloc(sizeof(COMP)*slot_size*Ts*n_slots);
+    if(samp_buffer == NULL) goto cleanup_bad_alloc;
 
     tdma->sample_buffer = samp_buffer;
 
+    size_t i;
+    struct TDMA_SLOT * slot;
+    struct TDMA_SLOT * last_slot;
+    struct FSK * slot_fsk;
+    last_slot = NULL;
+    for(i=0; i<n_slots; i++){
+        slot = (struct TDMA_SLOT *) malloc(sizeof(struct TDMA_SLOT));
+        if(slot == NULL) goto cleanup_bad_alloc;
+        slot->fsk = NULL;
+        tdma->slots = slot;
+        slot->next_slot = last_slot;
+        slot->slot_local_frame_offset = 0;
+        slot->state = rx_no_sync;
+        //slot_fsk = fsk_create_hbr(Fs,Rs,P,M,Rs,Rs);
+        slot_fsk = NULL;
+        if(slot_fsk == NULL) goto cleanup_bad_alloc;
+
+        fsk_enable_burst_mode(slot_fsk, slot_size);
+        
+        slot->fsk = slot_fsk;
+        last_slot = slot;
+    }
+    goto cleanup_bad_alloc;
     /* TODO: Allocate slot modems. Get pilot detection working first */
 
     return tdma;
 
+    /* Clean up after a failed malloc */
+    /* TODO: Run with valgrind/asan, make sure I'm getting everything */
+    cleanup_bad_alloc:
+    fprintf(stderr,"Cleaning up\n");
+    if(tdma == NULL) return NULL;
+
+    struct TDMA_SLOT * cleanup_slot = tdma->slots;
+    struct TDMA_SLOT * cleanup_slot_next;
+    while(cleanup_slot != NULL){
+        cleanup_slot_next = cleanup_slot->next_slot;
+        if(cleanup_slot->fsk != NULL) fsk_destroy(cleanup_slot->fsk);
+        if(cleanup_slot != NULL) free(cleanup_slot);
+        cleanup_slot = cleanup_slot_next;
+    }
+    if(pilot != NULL) fsk_destroy(pilot);
+    if(samp_buffer != NULL) free(samp_buffer);
+    free(tdma);
+    return NULL;
 }
 
 void tdma_print_stuff(struct TDMA_MODEM * tdma){