From 5da9b619b8193b98bb6ff720691595e033c450b9 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 09:10:36 +0100 Subject: erlc: Fix codechecker memory leak warning --- erts/etc/common/erlc.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c index 523ead86ed..6b00a1f48f 100644 --- a/erts/etc/common/erlc.c +++ b/erts/etc/common/erlc.c @@ -892,6 +892,8 @@ find_executable(char* progname) struct stat s; if (stat(real_name, &s) == 0 && s.st_mode & S_IFREG) { return real_name; + } else { + free(real_name); } } } while (*path++ == ':'); @@ -908,7 +910,11 @@ safe_realpath(char* file) * Solaris. */ char* real_name = emalloc(PATH_MAX + 1); - return realpath(file, real_name); + char* result = realpath(file, real_name); + if (result != real_name) { + free(real_name); + } + return result; } #endif -- cgit v1.2.1 From 1bc047cf740db31cc67e9cd557b710e90f8de68f Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 10:12:54 +0100 Subject: erlc: suppress code checker warning for intended leak --- erts/etc/common/erlc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c index 6b00a1f48f..b972e14c6c 100644 --- a/erts/etc/common/erlc.c +++ b/erts/etc/common/erlc.c @@ -186,6 +186,9 @@ set_env(char *key, char *value) efree(str); #endif #endif + /* codechecker_intentional [Malloc] we may leak str if we don't + have copying putenv but that is fine since we only have a + constant amount of environment variables */ } static void -- cgit v1.2.1 From 3050c8861577445a4e86b4770611e94947dbcbab Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 12:41:42 +0100 Subject: ct_run.c, typer.c, dialyzer.c: Fix memory leak pointed out by code_checker --- erts/etc/common/ct_run.c | 5 +++-- erts/etc/common/dialyzer.c | 7 +++++-- erts/etc/common/typer.c | 5 +++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/erts/etc/common/ct_run.c b/erts/etc/common/ct_run.c index efa7ac3493..b8551eaeaf 100644 --- a/erts/etc/common/ct_run.c +++ b/erts/etc/common/ct_run.c @@ -188,6 +188,7 @@ int main(int argc, char** argv) eargv = eargv_base; eargc = 0; push_words(emulator); + free(emulator); eargc_base = eargc; eargv = eargv + eargv_size/2; eargc = 0; @@ -516,7 +517,7 @@ get_default_emulator(char* progname) char* s; if (strlen(progname) >= sizeof(sbuf)) - return ERL_NAME; + return strsave(ERL_NAME); strcpy(sbuf, progname); for (s = sbuf+strlen(sbuf); s >= sbuf; s--) { @@ -527,7 +528,7 @@ get_default_emulator(char* progname) break; } } - return ERL_NAME; + return strsave(ERL_NAME); } #ifdef __WIN32__ diff --git a/erts/etc/common/dialyzer.c b/erts/etc/common/dialyzer.c index 37e07878ff..ae16d0c32b 100644 --- a/erts/etc/common/dialyzer.c +++ b/erts/etc/common/dialyzer.c @@ -214,6 +214,9 @@ int main(int argc, char** argv) eargv = eargv_base; eargc = 0; push_words(emulator); + if (emulator != env) { + free(emulator); + } eargc_base = eargc; eargv = eargv + eargv_size/2; eargc = 0; @@ -485,7 +488,7 @@ get_default_emulator(char* progname) char* s; if (strlen(progname) >= sizeof(sbuf)) - return ERL_NAME; + return strsave(ERL_NAME); strcpy(sbuf, progname); for (s = sbuf+strlen(sbuf); s >= sbuf; s--) { @@ -496,7 +499,7 @@ get_default_emulator(char* progname) break; } } - return ERL_NAME; + return strsave(ERL_NAME); } #ifdef __WIN32__ diff --git a/erts/etc/common/typer.c b/erts/etc/common/typer.c index f13135d883..c7af00bb46 100644 --- a/erts/etc/common/typer.c +++ b/erts/etc/common/typer.c @@ -163,6 +163,7 @@ main(int argc, char** argv) eargv = eargv_base; eargc = 0; push_words(emulator); + free(emulator); eargc_base = eargc; eargv = eargv + eargv_size/2; eargc = 0; @@ -410,7 +411,7 @@ get_default_emulator(char* progname) char* s; if (strlen(progname) >= sizeof(sbuf)) - return ERL_NAME; + return strsave(ERL_NAME); strcpy(sbuf, progname); for (s = sbuf+strlen(sbuf); s >= sbuf; s--) { @@ -421,7 +422,7 @@ get_default_emulator(char* progname) break; } } - return ERL_NAME; + return strsave(ERL_NAME); } #ifdef __WIN32__ -- cgit v1.2.1 From 1e3047c8f2f415e35f52312357c589d60495ae3d Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 14:44:05 +0100 Subject: erlexec.c: fix code_checker warning (potential memory leak of emu_name) --- erts/etc/common/erlexec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c index 0efacd67a1..2cb5b76cad 100644 --- a/erts/etc/common/erlexec.c +++ b/erts/etc/common/erlexec.c @@ -1041,6 +1041,8 @@ int main(int argc, char **argv) } } + efree(emu_name); + if (process_args) { ADD_BOOT_CONFIG; } -- cgit v1.2.1 From 689397e0111d1751ddb38a67abd1fe75b4ecab83 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 14:53:17 +0100 Subject: erlexec.c: code_checker warning fix (strndup allocated string) --- erts/etc/common/erlexec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c index 2cb5b76cad..5656068db0 100644 --- a/erts/etc/common/erlexec.c +++ b/erts/etc/common/erlexec.c @@ -1200,7 +1200,9 @@ int main(int argc, char **argv) if (flavor == NULL) { flavor = type; } else { - currbuff += sprintf(currbuff,"-emu_type %s ", strndup(type,flavor - type)); + char* emu_type = strndup(type,flavor - type); + currbuff += sprintf(currbuff,"-emu_type %s ", emu_type); + free(emu_type); flavor++; } currbuff += sprintf(currbuff,"-emu_flavor %s", flavor); -- cgit v1.2.1 From 28a3ef1307ac56449ec8e28ffc6b8e7c74c3a3f2 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 15:17:44 +0100 Subject: erlexec.c: code_checker fix leak warning (bindir_slug) --- erts/etc/common/erlexec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c index 5656068db0..2a0def7f48 100644 --- a/erts/etc/common/erlexec.c +++ b/erts/etc/common/erlexec.c @@ -574,7 +574,7 @@ int main(int argc, char **argv) in_index = bindir_slug_index + bindir_slug_length; out_index += block_length; } - + efree((void*)bindir_slug); strcpy(out_index, in_index); } -- cgit v1.2.1 From b55062101c3f1aa2cdc277fffc9fe95b6447e736 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 17 Mar 2021 15:39:54 +0100 Subject: inet_gethost.c: code_checker fix potential memory leak warning --- erts/etc/common/inet_gethost.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erts/etc/common/inet_gethost.c b/erts/etc/common/inet_gethost.c index 0e4ec402ab..54825219b4 100644 --- a/erts/etc/common/inet_gethost.c +++ b/erts/etc/common/inet_gethost.c @@ -1980,10 +1980,10 @@ static int worker_loop(void) } close_mesq(readfrom); close_mesq(writeto); +#endif if (reply) { FREE(reply); } -#endif return 1; } -- cgit v1.2.1 From 5f41ef5d3b8bc49b102ed3ee503e913ead08c005 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Thu, 18 Mar 2021 08:34:18 +0100 Subject: jit: fix code_checker warning (priv is both variable and type name) --- erts/etc/unix/jit-reader.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/erts/etc/unix/jit-reader.c b/erts/etc/unix/jit-reader.c index 6419570249..83481ba4f2 100644 --- a/erts/etc/unix/jit-reader.c +++ b/erts/etc/unix/jit-reader.c @@ -224,14 +224,14 @@ static void destroy(struct gdb_reader_funcs *self){ struct gdb_reader_funcs *gdb_init_reader(void){ struct gdb_reader_funcs *funcs = malloc(sizeof(struct gdb_reader_funcs)); - priv *priv = malloc(sizeof(priv)); - priv->num_ranges = 1; - priv->ranges = malloc(sizeof(range)); - priv->ranges[0].start = 0; - priv->ranges[0].end = 0; + priv *priv_data = malloc(sizeof(priv)); + priv_data->num_ranges = 1; + priv_data->ranges = malloc(sizeof(range)); + priv_data->ranges[0].start = 0; + priv_data->ranges[0].end = 0; funcs->reader_version = GDB_READER_INTERFACE_VERSION; - funcs->priv_data = priv; + funcs->priv_data = priv_data; funcs->read = read_debug_info; funcs->unwind = unwind; -- cgit v1.2.1 From 014589a76b634feb6d281d96ad41a1863ba1c0f4 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Thu, 18 Mar 2021 08:49:13 +0100 Subject: jit: Move struct to where it is used and remove constructor This change makes it clear where the struct is used and where its members are set. --- erts/emulator/beam/jit/x86/beam_asm_perf.cpp | 32 ++++++++++++---------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/erts/emulator/beam/jit/x86/beam_asm_perf.cpp b/erts/emulator/beam/jit/x86/beam_asm_perf.cpp index d0beec7eb3..5f7c274195 100644 --- a/erts/emulator/beam/jit/x86/beam_asm_perf.cpp +++ b/erts/emulator/beam/jit/x86/beam_asm_perf.cpp @@ -71,24 +71,6 @@ class JitPerfDump { Uint64 timestamp; }; - struct JitCodeLoadRecord { - RecordHeader header; - Uint32 pid; - Uint32 tid; - Uint64 vma; - Uint64 code_addr; - Uint64 code_size; - Uint64 code_index; - /* Null terminated M:F/A */ - /* Native code */ - - JitCodeLoadRecord() { - header.id = JIT_CODE_LOAD; - pid = getpid(); - tid = erts_thr_self(); - } - }; - public: bool init() { char name[MAXPATHLEN]; @@ -137,7 +119,21 @@ public: void update_perf_info(std::string modulename, std::vector &ranges) { + struct JitCodeLoadRecord { + RecordHeader header; + Uint32 pid; + Uint32 tid; + Uint64 vma; + Uint64 code_addr; + Uint64 code_size; + Uint64 code_index; + /* Null terminated M:F/A */ + /* Native code */ + }; JitCodeLoadRecord record; + record.header.id = JIT_CODE_LOAD; + record.pid = getpid(); + record.tid = erts_thr_self(); for (BeamAssembler::AsmRange &r : ranges) { size_t nameLen = r.name.size(); ptrdiff_t codeSize = (char *)r.stop - (char *)r.start; -- cgit v1.2.1 From 3b6906378334248cff6882512dd817efa3fa071a Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Thu, 18 Mar 2021 10:29:28 +0100 Subject: inet_gethost.c: Fix potential memory leak (found by code_checker) --- erts/etc/common/inet_gethost.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erts/etc/common/inet_gethost.c b/erts/etc/common/inet_gethost.c index 54825219b4..961b3288a6 100644 --- a/erts/etc/common/inet_gethost.c +++ b/erts/etc/common/inet_gethost.c @@ -1878,7 +1878,8 @@ static int worker_loop(void) DEBUGF(5,("getnameinfo returned %d", error_num)); if (error_num) { error_num = map_netdb_error_ai(error_num); - sa = NULL; + FREE(sa); + sa = NULL; } #elif defined(HAVE_GETIPNODEBYADDR) /*#ifdef HAVE_GETNAMEINFO*/ struct in6_addr ia; -- cgit v1.2.1