This is an automated email from Gerrit.

"Daniel Anselmi <danse...@gmx.ch>" just uploaded a new patch set to Gerrit, 
which you can find at https://review.openocd.org/c/openocd/+/7235

-- gerrit

commit 8e419ce30fdd77273341722cdd948ec36f1247e9
Author: Daniel Anselmi <danse...@gmx.ch>
Date:   Sun Oct 2 01:17:15 2022 +0200

    fix memory leak in virtex2 driver
    
    Change-Id: Ia08f7aaad25631132885acd5898477c1106f0ec4
    Signed-off-by: Daniel Anselmi <danse...@gmx.ch>

diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c
index 771af99397..b4861e9cb8 100644
--- a/src/pld/virtex2.c
+++ b/src/pld/virtex2.c
@@ -157,6 +157,8 @@ static int virtex2_load(struct pld_device *pld_device, 
const char *filename)
        virtex2_set_instr(virtex2_info->tap, 0x3f);             /* BYPASS */
        jtag_execute_queue();
 
+       xilinx_free_bit_file(&bit_file);
+
        return ERROR_OK;
 }
 
diff --git a/src/pld/xilinx_bit.c b/src/pld/xilinx_bit.c
index 25deb80822..7911b8dc14 100644
--- a/src/pld/xilinx_bit.c
+++ b/src/pld/xilinx_bit.c
@@ -87,26 +87,42 @@ int xilinx_read_bit_file(struct xilinx_bit_file *bit_file, 
const char *filename)
                return ERROR_PLD_FILE_LOAD_FAILED;
        }
 
+       bit_file->source_file = NULL;
+       bit_file->part_name = NULL;
+       bit_file->date = NULL;
+       bit_file->time = NULL;
+       bit_file->data = NULL;
+
        read_count = fread(bit_file->unknown_header, 1, 13, input_file);
        if (read_count != 13) {
                LOG_ERROR("couldn't read unknown_header from file '%s'", 
filename);
                return ERROR_PLD_FILE_LOAD_FAILED;
        }
 
-       if (read_section(input_file, 2, 'a', NULL, &bit_file->source_file) != 
ERROR_OK)
+       if (read_section(input_file, 2, 'a', NULL, &bit_file->source_file) != 
ERROR_OK) {
+               xilinx_free_bit_file(bit_file);
                return ERROR_PLD_FILE_LOAD_FAILED;
+       }
 
-       if (read_section(input_file, 2, 'b', NULL, &bit_file->part_name) != 
ERROR_OK)
+       if (read_section(input_file, 2, 'b', NULL, &bit_file->part_name) != 
ERROR_OK) {
+               xilinx_free_bit_file(bit_file);
                return ERROR_PLD_FILE_LOAD_FAILED;
+       }
 
-       if (read_section(input_file, 2, 'c', NULL, &bit_file->date) != ERROR_OK)
+       if (read_section(input_file, 2, 'c', NULL, &bit_file->date) != 
ERROR_OK) {
+               xilinx_free_bit_file(bit_file);
                return ERROR_PLD_FILE_LOAD_FAILED;
+       }
 
-       if (read_section(input_file, 2, 'd', NULL, &bit_file->time) != ERROR_OK)
+       if (read_section(input_file, 2, 'd', NULL, &bit_file->time) != 
ERROR_OK) {
+               xilinx_free_bit_file(bit_file);
                return ERROR_PLD_FILE_LOAD_FAILED;
+       }
 
-       if (read_section(input_file, 4, 'e', &bit_file->length, 
&bit_file->data) != ERROR_OK)
+       if (read_section(input_file, 4, 'e', &bit_file->length, 
&bit_file->data) != ERROR_OK) {
+               xilinx_free_bit_file(bit_file);
                return ERROR_PLD_FILE_LOAD_FAILED;
+       }
 
        LOG_DEBUG("bit_file: %s %s %s,%s %" PRIu32 "", bit_file->source_file, 
bit_file->part_name,
                bit_file->date, bit_file->time, bit_file->length);
@@ -115,3 +131,12 @@ int xilinx_read_bit_file(struct xilinx_bit_file *bit_file, 
const char *filename)
 
        return ERROR_OK;
 }
+
+void xilinx_free_bit_file(struct xilinx_bit_file *bit_file)
+{
+       free(bit_file->source_file);
+       free(bit_file->part_name);
+       free(bit_file->date);
+       free(bit_file->time);
+       free(bit_file->data);
+}
diff --git a/src/pld/xilinx_bit.h b/src/pld/xilinx_bit.h
index e30ed23377..f443bf70eb 100644
--- a/src/pld/xilinx_bit.h
+++ b/src/pld/xilinx_bit.h
@@ -22,4 +22,6 @@ struct xilinx_bit_file {
 
 int xilinx_read_bit_file(struct xilinx_bit_file *bit_file, const char 
*filename);
 
+void xilinx_free_bit_file(struct xilinx_bit_file *bit_file);
+
 #endif /* OPENOCD_PLD_XILINX_BIT_H */

-- 

Reply via email to