From 767c8728f7f675be851e4bed40e35bfd692cfd1b Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Mon, 15 May 2023 22:38:52 +0000 Subject: [PATCH] Fix memory leaks in hdoc. --- src/HeaderParser.c | 1 + src/RtStub.c | 8 ++++---- src/Runtime.c | 13 +++++++++---- src/include/Runtime.h | 4 ++-- tools/hdoc.c | 14 +++++++++++++- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/HeaderParser.c b/src/HeaderParser.c index 9f03ac5..55c2d5f 100644 --- a/src/HeaderParser.c +++ b/src/HeaderParser.c @@ -417,6 +417,7 @@ HeaderParse(Stream * stream, HeaderExpr * expr) StrEquals(word, "endif")) { /* Read no more words, that's the whole directive */ + Free(word); } else { diff --git a/src/RtStub.c b/src/RtStub.c index 8302f40..f4497a8 100644 --- a/src/RtStub.c +++ b/src/RtStub.c @@ -98,7 +98,7 @@ main(int argc, char **argv) envp = environ; while (*envp) { - size_t valInd; + size_t valInd; /* It is unclear whether or not envp strings are writable, so * we make our own copy to manipulate it */ @@ -109,7 +109,7 @@ main(int argc, char **argv) val = key + valInd + 1; HashMapSet(args.env, key, StrDuplicate(val)); Free(key); - envp++; + envp++; } if (pthread_create(&mainThread, NULL, MainThread, &args) != 0) @@ -146,7 +146,7 @@ finish: HashMapFree(args.env); } - Log(LOG_DEBUG, "Exitting with code: %d", ret); + Log(LOG_DEBUG, "Exitting with code: %d", ret); LogConfigFree(LogConfigGlobal()); @@ -154,7 +154,7 @@ finish: StreamClose(StreamStdin()); StreamClose(StreamStderr()); - GenerateMemoryReport(argv[0]); + GenerateMemoryReport(argc, argv); MemoryFreeAll(); diff --git a/src/Runtime.c b/src/Runtime.c index f933ffc..9eb6683 100644 --- a/src/Runtime.c +++ b/src/Runtime.c @@ -62,7 +62,7 @@ MemoryIterator(MemoryInfo * i, void *args) } void -GenerateMemoryReport(const char *prog) +GenerateMemoryReport(int argc, char **argv) { char reportName[128]; char *namePtr; @@ -77,6 +77,7 @@ GenerateMemoryReport(const char *prog) time_t currentTime; struct tm *timeInfo; char tsBuffer[1024]; + size_t i; if (!MemoryAllocated()) { @@ -86,7 +87,7 @@ GenerateMemoryReport(const char *prog) return; } - snprintf(reportName, sizeof(reportName), "%s-leaked.txt", prog); + snprintf(reportName, sizeof(reportName), "%s-leaked.txt", argv[0]); /* Make sure the report goes in the current working directory. */ namePtr = basename(reportName); report = fopen(namePtr, "a"); @@ -100,8 +101,12 @@ GenerateMemoryReport(const char *prog) strftime(tsBuffer, sizeof(tsBuffer), "%c", timeInfo); fprintf(report, "---------- Memory Report ----------\n"); - fprintf(report, "Program: %s\n", prog); - fprintf(report, "Date: %s\n", tsBuffer); + fprintf(report, "Program:"); + for (i = 0; i < argc; i++) + { + fprintf(report, " '%s'", argv[i]); + } + fprintf(report, "\nDate: %s\n", tsBuffer); fprintf(report, "Total Bytes: %lu\n", MemoryAllocated()); fprintf(report, "\n"); diff --git a/src/include/Runtime.h b/src/include/Runtime.h index f3bb6b2..6e13b6a 100644 --- a/src/include/Runtime.h +++ b/src/include/Runtime.h @@ -41,13 +41,13 @@ /** * Write a memory report to a file in the current directory, using - * the provided string as the name of the program currently being + * the provided program arguments, including the program name that * executed. This function is to be called after all memory is * supposed to have been freed. It iterates over all remaining * memory and generates a text file containing all of the * recorded information about each block, including a hex dump of * the data stored in them. */ -extern void GenerateMemoryReport(const char *); +extern void GenerateMemoryReport(int argc, char **argv); #endif /* CYTOPLASM_RUNTIME_H */ diff --git a/tools/hdoc.c b/tools/hdoc.c index 51c7999..1d1bbaa 100644 --- a/tools/hdoc.c +++ b/tools/hdoc.c @@ -527,23 +527,35 @@ finish: for (i = 0; i < ArraySize(declarations); i++) { - Free(ArrayGet(declarations, i)); + size_t j; + + decl = ArrayGet(declarations, i); + for (j = 0; j < ArraySize(decl->decl.args); j++) + { + Free(ArrayGet(decl->decl.args, j)); + } + ArrayFree(decl->decl.args); + Free(decl); } + ArrayFree(declarations); for (i = 0; i < ArraySize(typedefs); i++) { Free(ArrayGet(typedefs, i)); } + ArrayFree(typedefs); for (i = 0; i < ArraySize(globals); i++) { Free(ArrayGet(globals, i)); } + ArrayFree(globals); for (i = 0; i < ArraySize(descr); i++) { Free(ArrayGet(descr, i)); } + ArrayFree(descr); while (HashMapIterate(registers, &key, (void **) &val)) {