From c91bdefa1a25015f0ec0726830e15d12fe1ca653 Mon Sep 17 00:00:00 2001 From: jenniferliddle Date: Tue, 11 Jul 2017 14:40:39 +0100 Subject: [PATCH] Bug fix: remove memory leak from decode --- src/decode.c | 4 +++- test/t_decode.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/decode.c b/src/decode.c index 44d81f2..1d2b780 100644 --- a/src/decode.c +++ b/src/decode.c @@ -739,9 +739,11 @@ int processTemplate(va_t *template, BAMit_t *bam_out, va_t *barcodeArray, opts_t for (int n=0; n < template->end; n++) { bam1_t *rec = template->entries[n]; if (bc_tag) { - char *newtag = strdup(bc_tag); + char *newtag; if (opts->convert_low_quality) { newtag = checkBarcodeQuality(bc_tag,rec,opts); + } else { + newtag = strdup(bc_tag); } if (strlen(bc_tag) > opts->tag_len) { newtag[opts->tag_len] = 0; // truncate seq to barcode length diff --git a/test/t_decode.c b/test/t_decode.c index c3ce58c..4b30c32 100644 --- a/test/t_decode.c +++ b/test/t_decode.c @@ -82,6 +82,12 @@ void setup_test_2(int* argc, char*** argv, char *outputfile) (*argv)[17] = strdup("RT"); } +void free_argv(int argc, char *argv[]) +{ + for (int n=0; n < argc; free(argv[n++])); + free(argv); +} + void test_noCalls(char *s, int e) { int n; @@ -163,6 +169,7 @@ int main(int argc, char**argv) setup_test_1(&argc_1, &argv_1, outputfile); main_decode(argc_1-1, argv_1+1); + free_argv(argc_1,argv_1); char *cmd = calloc(1,1024); sprintf(cmd,"diff -I ID:bambi %s %s", outputfile, MKNAME(DATA_DIR,"/out/6383_9_nosplit_nochange.sam")); @@ -180,6 +187,7 @@ int main(int argc, char**argv) sprintf(outputfile,"%s/decode_2.sam",TMPDIR); setup_test_2(&argc_2, &argv_2, outputfile); main_decode(argc_2-1, argv_2+1); + free_argv(argc_2,argv_2); sprintf(cmd,"diff -I ID:bambi %s %s", outputfile, MKNAME(DATA_DIR,"/out/6383_8_nosplitN.sam")); result = system(cmd); @@ -190,6 +198,9 @@ int main(int argc, char**argv) success++; } + free(outputfile); + free(cmd); + printf("decode tests: %s\n", failure ? "FAILED" : "Passed"); return failure ? EXIT_FAILURE : EXIT_SUCCESS; }