aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMooneer Salem <[email protected]>2024-03-28 12:30:00 -0700
committerMooneer Salem <[email protected]>2024-03-28 12:30:00 -0700
commit9879bea79deca674135c26482db6eb43770d14c9 (patch)
treefad88e1230fd9da1eed93bcb8a71ca16e37ec6b2
parentee4b2043db41ce26cfa69d5611175821b362b872 (diff)
More memory leak and crash fixes.
-rw-r--r--src/cohpsk_put_test_bits.c3
-rw-r--r--src/fmfsk.c1
-rw-r--r--src/freedv_api.c2
-rw-r--r--src/freedv_fsk.c4
-rw-r--r--src/freedv_vhf_framing.c1
-rw-r--r--unittest/tcohpsk.c9
-rw-r--r--unittest/tfreedv_2400B_rawdata.c3
-rw-r--r--unittest/tfreedv_800XA_rawdata.c4
8 files changed, 21 insertions, 6 deletions
diff --git a/src/cohpsk_put_test_bits.c b/src/cohpsk_put_test_bits.c
index de41da2..74aa51e 100644
--- a/src/cohpsk_put_test_bits.c
+++ b/src/cohpsk_put_test_bits.c
@@ -65,11 +65,13 @@ int main(int argc, char *argv[]) {
}
coh = cohpsk_create();
+ assert(coh != NULL);
foct = NULL;
logframes = 0;
if (argc == 3) {
if ((foct = fopen(argv[2], "wt")) == NULL) {
+ cohpsk_destroy(coh);
fprintf(stderr, "Error opening output Octave file: %s: %s.\n", argv[2],
strerror(errno));
exit(1);
@@ -101,6 +103,7 @@ int main(int argc, char *argv[]) {
}
fclose(fin);
+ cohpsk_destroy(coh);
float ber = (float)nerrors / nbits;
fprintf(stderr, "BER: %4.3f Nbits: %d Nerrors: %d\n", ber, nbits, nerrors);
diff --git a/src/fmfsk.c b/src/fmfsk.c
index b1745fa..c6dd6d9 100644
--- a/src/fmfsk.c
+++ b/src/fmfsk.c
@@ -93,6 +93,7 @@ struct FMFSK *fmfsk_create(int Fs, int Rb) {
* Destroys an fmfsk modem and deallocates memory
*/
void fmfsk_destroy(struct FMFSK *fmfsk) {
+ free(fmfsk->stats);
free(fmfsk->oldsamps);
free(fmfsk);
}
diff --git a/src/freedv_api.c b/src/freedv_api.c
index 5172959..11ed910 100644
--- a/src/freedv_api.c
+++ b/src/freedv_api.c
@@ -214,11 +214,13 @@ void freedv_close(struct freedv *freedv) {
if (FDV_MODE_ACTIVE(FREEDV_MODE_2400A, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_800XA, freedv->mode)) {
+ FREE(freedv->tx_bits);
fsk_destroy(freedv->fsk);
fvhff_destroy_deframer(freedv->deframer);
}
if (FDV_MODE_ACTIVE(FREEDV_MODE_2400B, freedv->mode)) {
+ FREE(freedv->tx_bits);
fmfsk_destroy(freedv->fmfsk);
fvhff_destroy_deframer(freedv->deframer);
}
diff --git a/src/freedv_fsk.c b/src/freedv_fsk.c
index ea346c2..dfc7b98 100644
--- a/src/freedv_fsk.c
+++ b/src/freedv_fsk.c
@@ -91,7 +91,7 @@ void freedv_2400b_open(struct freedv *f) {
f->n_codec_frames = 1;
f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2);
f->bits_per_modem_frame = f->bits_per_codec_frame;
- int n_packed_bytes = (f->bits_per_modem_frame + 7) / 8;
+ int n_packed_bytes = (f->bits_per_modem_frame + 7) / 8 + 1;
f->tx_payload_bits = MALLOC(n_packed_bytes);
assert(f->tx_payload_bits != NULL);
f->rx_payload_bits = MALLOC(n_packed_bytes);
@@ -123,7 +123,7 @@ void freedv_800xa_open(struct freedv *f) {
f->bits_per_codec_frame = codec2_bits_per_frame(f->codec2);
f->bits_per_modem_frame = f->n_codec_frames * f->bits_per_codec_frame;
- int n_packed_bytes = (f->bits_per_modem_frame + 7.0) / 8.0 + 0.5;
+ int n_packed_bytes = (f->bits_per_modem_frame + 7) / 8;
f->tx_payload_bits = MALLOC(n_packed_bytes);
assert(f->tx_payload_bits != NULL);
f->rx_payload_bits = MALLOC(n_packed_bytes);
diff --git a/src/freedv_vhf_framing.c b/src/freedv_vhf_framing.c
index d596025..37dbaf3 100644
--- a/src/freedv_vhf_framing.c
+++ b/src/freedv_vhf_framing.c
@@ -391,6 +391,7 @@ int fvhff_get_varicode_size(struct freedv_vhf_deframer *def) {
void fvhff_destroy_deframer(struct freedv_vhf_deframer *def) {
freedv_data_channel_destroy(def->fdc);
free(def->bits);
+ free(def->invbits);
free(def);
}
diff --git a/unittest/tcohpsk.c b/unittest/tcohpsk.c
index 1519d7d..777bc29 100644
--- a/unittest/tcohpsk.c
+++ b/unittest/tcohpsk.c
@@ -71,8 +71,8 @@ int main(int argc, char *argv[]) {
int tx_bits_log[COHPSK_BITS_PER_FRAME * FRAMES];
COMP tx_symb_log[NSYMROWPILOT * FRAMES][COHPSK_NC * COHPSK_ND];
COMP tx_fdm_frame_log[COHPSK_M * NSYMROWPILOT * FRAMES];
- COMP ch_fdm_frame_log[COHPSK_M * NSYMROWPILOT * FRAMES];
- COMP ch_fdm_frame_log_out[(COHPSK_M * NSYMROWPILOT + 1) * FRAMES];
+ COMP ch_fdm_frame_log[COHPSK_M * NSYMROWPILOT * FRAMESL];
+ COMP ch_fdm_frame_log_out[(COHPSK_M * NSYMROWPILOT + 1) * FRAMESL];
// COMP rx_fdm_frame_bb_log[M*NSYMROWPILOT*FRAMES];
// COMP ch_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND];
COMP ct_symb_ff_log[NSYMROWPILOT * FRAMES][COHPSK_NC * COHPSK_ND];
@@ -318,6 +318,11 @@ int main(int argc, char *argv[]) {
#endif
fclose(fout);
+ free(coh->rx_baseband_log);
+ free(coh->rx_filt_log);
+ free(coh->ch_symb_log);
+ free(coh->rx_timing_log);
+
cohpsk_destroy(coh);
return 0;
diff --git a/unittest/tfreedv_2400B_rawdata.c b/unittest/tfreedv_2400B_rawdata.c
index f515bb5..b8509c6 100644
--- a/unittest/tfreedv_2400B_rawdata.c
+++ b/unittest/tfreedv_2400B_rawdata.c
@@ -100,6 +100,9 @@ int main(int argc, char **argv) {
}
}
}
+
+ freedv_close(f);
+
if (!frames) {
printf("Did not decode any frames successfully\n");
goto fail;
diff --git a/unittest/tfreedv_800XA_rawdata.c b/unittest/tfreedv_800XA_rawdata.c
index 2b34c41..89c1b59 100644
--- a/unittest/tfreedv_800XA_rawdata.c
+++ b/unittest/tfreedv_800XA_rawdata.c
@@ -79,7 +79,7 @@ int main(int argc, char **argv) {
unsigned char payload_tx[7] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde};
printf("freedv_codec_frames_from_rawdata() ");
- unsigned char codec_frames[8] = {0};
+ unsigned char codec_frames[9] = {0};
freedv_codec_frames_from_rawdata(f, codec_frames, payload_tx);
int fails = 0;
for (i = 0; i < 8; i++) {
@@ -93,7 +93,7 @@ int main(int argc, char **argv) {
printf("Passed\n");
printf("freedv_rawdata_from_codec_frames() ");
- unsigned char rawdata[7] = {0};
+ unsigned char rawdata[8] = {0};
freedv_rawdata_from_codec_frames(f, rawdata, payload);
fails = 0;
for (i = 0; i < 7; i++) {