From 5e3c41b058b320f5f2524d11b1f134864da30e5a Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Wed, 4 Sep 2019 16:48:13 +0200 Subject: [PATCH] C: Fixed opened DIR leak --- python/obitools3/commands/test.pyx | 5 +++ src/obidmscolumn.c | 55 ++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/python/obitools3/commands/test.pyx b/python/obitools3/commands/test.pyx index 80f1d2a..5bc6de7 100755 --- a/python/obitools3/commands/test.pyx +++ b/python/obitools3/commands/test.pyx @@ -23,6 +23,7 @@ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \ import shutil import string import random +#import subprocess VIEW_TYPES = [b"", b"NUC_SEQS_VIEW"] @@ -516,6 +517,10 @@ def run(config): i+=1 if (i%(config['test']['nbtests']/10)) == 0 : print("Testing......"+str(i*100/config['test']['nbtests'])+"%") + #lsof = subprocess.Popen("lsof | grep '/private/tmp/test_dms.obidms/'", stdin=subprocess.PIPE, shell=True ) + #lsof.communicate( b"LSOF\n" ) + #lsof = subprocess.Popen("lsof | wc -l", stdin=subprocess.PIPE, shell=True ) + #lsof.communicate( b"LSOF total\n" ) #print(infos) diff --git a/src/obidmscolumn.c b/src/obidmscolumn.c index 16e4f2b..6edcf21 100644 --- a/src/obidmscolumn.c +++ b/src/obidmscolumn.c @@ -368,11 +368,18 @@ static obiversion_t obi_get_new_version_number(OBIDMS_column_directory_p column_ if (version_file_descriptor < 0) { if (errno == ENOENT) + { + free(version_file_name); + free(column_directory_name); + closedir(col_directory); return create_version_file(column_directory); + } else { obi_set_errno(OBICOL_UNKNOWN_ERROR); obidebug(1, "\nError opening a version file"); + free(column_directory_name); + closedir(col_directory); free(version_file_name); return -1; } @@ -380,7 +387,13 @@ static obiversion_t obi_get_new_version_number(OBIDMS_column_directory_p column_ free(version_file_name); free(column_directory_name); - closedir(col_directory); + if (closedir(col_directory) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError opening a version file"); + close(version_file_descriptor); + return -1; + } // Test if the version file size is ok if (lseek(version_file_descriptor, 0, SEEK_END) < loc_size) @@ -1193,7 +1206,13 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, free(column_file_name); free(column_directory_name); - closedir(col_dir); + if (closedir(col_dir) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError closing a column directory"); + close(column_file_descriptor); + return NULL; + } // Truncate the column file to the right size if (ftruncate(column_file_descriptor, file_size) < 0) @@ -1453,7 +1472,13 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms, free(column_file_name); free(column_directory_name); - closedir(col_dir); + if (closedir(col_dir) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError closing a column directory"); + close(column_file_descriptor); + return NULL; + } // Allocate the memory for the column structure column = (OBIDMS_column_p) malloc(sizeof(OBIDMS_column_t)); @@ -1807,7 +1832,13 @@ int obi_truncate_column(OBIDMS_column_p column) // TODO is it necessary to unmap free(column_file_name); free(column_directory_name); - closedir(col_dir); + if (closedir(col_dir) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError closing a column directory"); + close(column_file_descriptor); + return -1; + } // Unmap the data before truncating the file if (munmap(column->data, (column->header)->data_size) < 0) @@ -1932,7 +1963,13 @@ int obi_enlarge_column(OBIDMS_column_p column) free(column_file_name); free(column_directory_name); - closedir(col_dir); + if (closedir(col_dir) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError closing a column directory"); + close(column_file_descriptor); + return -1; + } // Calculate the new file size old_line_count = (column->header)->line_count; @@ -2227,7 +2264,13 @@ OBIDMS_column_header_p obi_column_get_header_from_name(OBIDMS_p dms, const char* free(column_file_name); free(column_directory_name); - closedir(col_dir); + if (closedir(col_dir) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError closing a column directory"); + close(column_file_descriptor); + return NULL; + } // Read the header size if (read(column_file_descriptor, &header_size, sizeof(size_t)) < ((ssize_t) sizeof(size_t)))