summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjell Winblad <kjellwinblad@gmail.com>2021-04-08 15:23:39 +0200
committerKjell Winblad <kjellwinblad@gmail.com>2021-04-08 15:23:39 +0200
commit3b3729d0c98e9e38743ee981b75576a45b5633d2 (patch)
treed0ae630a7ce2f3b90ae7b2c2f9778f89070f1bfb
parent2987e6073cf919ff58f7d4cc98aa2a7f1e7f2f28 (diff)
parent3b6906378334248cff6882512dd817efa3fa071a (diff)
downloaderlang-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.cpp32
-rw-r--r--erts/etc/common/ct_run.c5
-rw-r--r--erts/etc/common/dialyzer.c7
-rw-r--r--erts/etc/common/erlc.c11
-rw-r--r--erts/etc/common/erlexec.c8
-rw-r--r--erts/etc/common/inet_gethost.c5
-rw-r--r--erts/etc/common/typer.c5
-rw-r--r--erts/etc/unix/jit-reader.c12
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;