diff options
author | Kjell Winblad <kjellwinblad@gmail.com> | 2021-04-08 15:23:39 +0200 |
---|---|---|
committer | Kjell Winblad <kjellwinblad@gmail.com> | 2021-04-08 15:23:39 +0200 |
commit | 3b3729d0c98e9e38743ee981b75576a45b5633d2 (patch) | |
tree | d0ae630a7ce2f3b90ae7b2c2f9778f89070f1bfb | |
parent | 2987e6073cf919ff58f7d4cc98aa2a7f1e7f2f28 (diff) | |
parent | 3b6906378334248cff6882512dd817efa3fa071a (diff) | |
download | erlang-3b3729d0c98e9e38743ee981b75576a45b5633d2.tar.gz |
Merge branch 'kjell/erts/fix_code_checker_warnings/OTP-17048'
* kjell/erts/fix_code_checker_warnings/OTP-17048:
inet_gethost.c: Fix potential memory leak (found by code_checker)
jit: Move struct to where it is used and remove constructor
jit: fix code_checker warning (priv is both variable and type name)
inet_gethost.c: code_checker fix potential memory leak warning
erlexec.c: code_checker fix leak warning (bindir_slug)
erlexec.c: code_checker warning fix (strndup allocated string)
erlexec.c: fix code_checker warning (potential memory leak of emu_name)
ct_run.c, typer.c, dialyzer.c: Fix memory leak pointed out by code_checker
erlc: suppress code checker warning for intended leak
erlc: Fix codechecker memory leak warning
-rw-r--r-- | erts/emulator/beam/jit/x86/beam_asm_perf.cpp | 32 | ||||
-rw-r--r-- | erts/etc/common/ct_run.c | 5 | ||||
-rw-r--r-- | erts/etc/common/dialyzer.c | 7 | ||||
-rw-r--r-- | erts/etc/common/erlc.c | 11 | ||||
-rw-r--r-- | erts/etc/common/erlexec.c | 8 | ||||
-rw-r--r-- | erts/etc/common/inet_gethost.c | 5 | ||||
-rw-r--r-- | erts/etc/common/typer.c | 5 | ||||
-rw-r--r-- | erts/etc/unix/jit-reader.c | 12 |
8 files changed, 50 insertions, 35 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<BeamAssembler::AsmRange> &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; 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/erlc.c b/erts/etc/common/erlc.c index 523ead86ed..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 @@ -892,6 +895,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 +913,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 diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c index 0efacd67a1..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); } @@ -1041,6 +1041,8 @@ int main(int argc, char **argv) } } + efree(emu_name); + if (process_args) { ADD_BOOT_CONFIG; } @@ -1198,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); diff --git a/erts/etc/common/inet_gethost.c b/erts/etc/common/inet_gethost.c index 0e4ec402ab..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; @@ -1980,10 +1981,10 @@ static int worker_loop(void) } close_mesq(readfrom); close_mesq(writeto); +#endif if (reply) { FREE(reply); } -#endif return 1; } 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__ 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; |