From f2f972bb9de2da297e79d8f8d0b5eb5d52b435f4 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. --- Cytoplasm/src/HeaderParser.c | 1 + Cytoplasm/src/RtStub.c | 8 ++++---- Cytoplasm/src/Runtime.c | 13 +++++++++---- Cytoplasm/src/include/Runtime.h | 4 ++-- Cytoplasm/tools/hdoc.c | 14 +++++++++++++- TODO.txt | 2 +- src/Main.c | 2 +- tools/bin/td | 4 +++- tools/src/http.c | 2 +- tools/src/json.c | 2 +- 10 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Cytoplasm/src/HeaderParser.c b/Cytoplasm/src/HeaderParser.c index 9f03ac5..55c2d5f 100644 --- a/Cytoplasm/src/HeaderParser.c +++ b/Cytoplasm/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/Cytoplasm/src/RtStub.c b/Cytoplasm/src/RtStub.c index 8302f40..f4497a8 100644 --- a/Cytoplasm/src/RtStub.c +++ b/Cytoplasm/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/Cytoplasm/src/Runtime.c b/Cytoplasm/src/Runtime.c index f933ffc..9eb6683 100644 --- a/Cytoplasm/src/Runtime.c +++ b/Cytoplasm/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/Cytoplasm/src/include/Runtime.h b/Cytoplasm/src/include/Runtime.h index f3bb6b2..6e13b6a 100644 --- a/Cytoplasm/src/include/Runtime.h +++ b/Cytoplasm/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/Cytoplasm/tools/hdoc.c b/Cytoplasm/tools/hdoc.c index 51c7999..1d1bbaa 100644 --- a/Cytoplasm/tools/hdoc.c +++ b/Cytoplasm/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)) { diff --git a/TODO.txt b/TODO.txt index fcec6da..d057727 100644 --- a/TODO.txt +++ b/TODO.txt @@ -24,7 +24,7 @@ Milestone: v0.3.0 [ ] Debug OpenSSL [ ] Documentation [ ] hdoc(1) and hdoc(5) - [ ] Fix memory leaks in hdoc + [x] Fix memory leaks in hdoc Milestone: v0.4.0 ----------------- diff --git a/src/Main.c b/src/Main.c index dd30159..0602c03 100644 --- a/src/Main.c +++ b/src/Main.c @@ -91,7 +91,7 @@ typedef enum ArgFlag } ArgFlag; int -Main(Array *args) +Main(Array * args) { int exit; diff --git a/tools/bin/td b/tools/bin/td index 4b36acf..03f3685 100644 --- a/tools/bin/td +++ b/tools/bin/td @@ -126,7 +126,9 @@ recipe_docs() { recipe_cytoplasm() { cd Cytoplasm export TLS_IMPL - sh make.sh + if ! sh make.sh; then + exit 1 + fi CYTOPLASM_FLAGS="Cytoplasm/out/lib/cytoplasm.o -LCytoplasm/out/lib -lcytoplasm $(sh make.sh libs)" cd - > /dev/null } diff --git a/tools/src/http.c b/tools/src/http.c index 9dfba5b..d3e7aa3 100644 --- a/tools/src/http.c +++ b/tools/src/http.c @@ -44,7 +44,7 @@ usage(char *prog) } int -Main(Array *args) +Main(Array * args) { HttpClientContext *cx; HttpStatus res; diff --git a/tools/src/json.c b/tools/src/json.c index dd4469b..041d831 100644 --- a/tools/src/json.c +++ b/tools/src/json.c @@ -178,7 +178,7 @@ encode(char *str) } int -Main(Array *args) +Main(Array * args) { HashMap *json; int flag = 0;