From 6ce8ceacae04955f2ccaf93f14c086b72bc14f09 Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Fri, 27 Nov 2009 13:43:05 -0500 Subject: [PATCH] Fix leaks and invalid memory accesses Signed-off-by: Benjamin Poirier --- lttv/lttv/sync/event_analysis_chull.c | 1 + lttv/lttv/sync/event_analysis_eval.c | 10 ++++++---- lttv/lttv/sync/event_processing_text.c | 18 +++++++++++++----- lttv/lttv/sync/sync_chain_unittest.c | 8 +++++++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/lttv/lttv/sync/event_analysis_chull.c b/lttv/lttv/sync/event_analysis_chull.c index e77eabd2..0e583791 100644 --- a/lttv/lttv/sync/event_analysis_chull.c +++ b/lttv/lttv/sync/event_analysis_chull.c @@ -342,6 +342,7 @@ static void destroyAnalysisCHull(SyncState* const syncState) for (j= 0; j < syncState->traceNb; j++) { g_queue_foreach(analysisData->hullArray[i][j], gfPointDestroy, NULL); + g_queue_free(analysisData->hullArray[i][j]); } free(analysisData->hullArray[i]); } diff --git a/lttv/lttv/sync/event_analysis_eval.c b/lttv/lttv/sync/event_analysis_eval.c index 3c3f8636..0c8e0497 100644 --- a/lttv/lttv/sync/event_analysis_eval.c +++ b/lttv/lttv/sync/event_analysis_eval.c @@ -584,7 +584,7 @@ static void destroyAnalysisEval(SyncState* const syncState) for (j= 0; j < i; j++) { // There seems to be a memory leak in glpk, valgrind reports a - // loss even if the problem is deleted + // loss (reachable) even if the problem is deleted glp_delete_prob(graphs->lps[i][j]); } free(graphs->lps[i]); @@ -1741,20 +1741,23 @@ static void finalizeAnalysisEvalLP(SyncState* const syncState) unsigned int i, j; AnalysisDataEval* analysisData= syncState->analysisData; AnalysisDataCHull* chAnalysisData= analysisData->chullSS->analysisData; - FactorsCHull** lpFactorsArray= createAllFactors(syncState->traceNb); - FactorsCHull* lpFactors; + FactorsCHull** lpFactorsArray; if (!syncState->stats && !syncState->graphsStream) { return; } + /* Because of matching_distributor, this analysis may be called twice. + * Only run it once */ if ((syncState->graphsStream && analysisData->graphs->lps != NULL) || (syncState->stats && analysisData->stats->chFactorsArray != NULL)) { return; } + lpFactorsArray= createAllFactors(syncState->traceNb); + if (syncState->stats) { analysisData->stats->chFactorsArray= @@ -1794,7 +1797,6 @@ static void finalizeAnalysisEvalLP(SyncState* const syncState) else { glp_delete_prob(lp); - destroyFactorsCHull(lpFactors); } } } diff --git a/lttv/lttv/sync/event_processing_text.c b/lttv/lttv/sync/event_processing_text.c index 9dd5d302..8471096a 100644 --- a/lttv/lttv/sync/event_processing_text.c +++ b/lttv/lttv/sync/event_processing_text.c @@ -16,6 +16,7 @@ * MA 02111-1307, USA. */ +#define _GNU_SOURCE #define NANOSECONDS_PER_SECOND 1000000000 #define CPU_FREQ 1e9 @@ -120,6 +121,8 @@ static void destroyProcessingText(SyncState* const syncState) return; } + fclose(processingData->testCase); + if (syncState->stats && processingData->factors) { g_array_free(processingData->factors, TRUE); @@ -139,7 +142,6 @@ static void destroyProcessingText(SyncState* const syncState) */ static void finalizeProcessingText(SyncState* const syncState) { - size_t len; int retval; unsigned int* seq; GArray* factors; @@ -147,11 +149,12 @@ static void finalizeProcessingText(SyncState* const syncState) syncState->processingData; FILE* testCase= processingData->testCase; char* line= NULL; + size_t bufLen; seq= calloc(syncState->traceNb, sizeof(unsigned int)); skipCommentLines(testCase); - retval= getline(&line, &len, testCase); + retval= getline(&line, &bufLen, testCase); while(!feof(testCase)) { unsigned int sender, receiver; @@ -164,9 +167,9 @@ static void finalizeProcessingText(SyncState* const syncState) g_error(strerror(errno)); } - if (line[len - 1] == '\n') + if (line[retval - 1] == '\n') { - line[len - 1]= '\0'; + line[retval - 1]= '\0'; } retval= sscanf(line, " %u %u %lf %lf %c", &sender, &receiver, @@ -262,7 +265,7 @@ static void finalizeProcessingText(SyncState* const syncState) seq[sender]++; skipCommentLines(testCase); - retval= getline(&line, &len, testCase); + retval= getline(&line, &bufLen, testCase); } free(seq); @@ -352,6 +355,11 @@ static unsigned int readTraceNb(FILE* testCase) abort(); } + if (line) + { + free(line); + } + return result; } diff --git a/lttv/lttv/sync/sync_chain_unittest.c b/lttv/lttv/sync/sync_chain_unittest.c index 9b4b869c..5d475ea8 100644 --- a/lttv/lttv/sync/sync_chain_unittest.c +++ b/lttv/lttv/sync/sync_chain_unittest.c @@ -98,6 +98,7 @@ int main(const int argc, char* const argv[]) bool stats; const char* testCaseName; GString* analysisModulesNames; + unsigned int id; // Initialize data structures syncState= malloc(sizeof(SyncState)); @@ -137,7 +138,7 @@ int main(const int argc, char* const argv[]) else { syncState->stats= false; - g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, nullLog, NULL); + id= g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, nullLog, NULL); } if (optionSyncGraphs.present) @@ -227,6 +228,11 @@ int main(const int argc, char* const argv[]) endUsage.ru_stime.tv_usec); } + if (!optionSyncStats.present) + { + g_log_remove_handler(NULL, id); + } + return EXIT_SUCCESS; } -- 2.34.1