aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@arm.com>2021-01-05 15:37:09 +0000
committerRoss Burton <ross.burton@arm.com>2021-01-08 13:14:01 +0000
commit18afd8a65687c847d2dce790ceb5053d547928c4 (patch)
treea68d9f1ed20a063e520003509f6c652ac7b9691c
parent2e1ee7fdc9c97ea51b6ffe21df49310ef0932968 (diff)
downloadpseudo-18afd8a65687c847d2dce790ceb5053d547928c4.tar.gz
pseudo-18afd8a65687c847d2dce790ceb5053d547928c4.tar.bz2
pseudo-18afd8a65687c847d2dce790ceb5053d547928c4.zip
Fix some memory leaks
pseudo_get_value() returns newly allocated memory that the caller must free, so add some free() calls. Signed-off-by: Ross Burton <ross.burton@arm.com>
-rw-r--r--pseudo.c4
-rw-r--r--pseudo_client.c9
-rw-r--r--pseudo_util.c2
3 files changed, 14 insertions, 1 deletions
diff --git a/pseudo.c b/pseudo.c
index 55f0f18..f2e2f87 100644
--- a/pseudo.c
+++ b/pseudo.c
@@ -245,10 +245,12 @@ main(int argc, char *argv[]) {
/* Options are processed, preserve them... */
pseudo_set_value("PSEUDO_OPTS", opts);
- if (!pseudo_get_prefix(argv[0])) {
+ s = pseudo_get_prefix(argv[0]);
+ if (!s) {
pseudo_diag("Can't figure out prefix. Set PSEUDO_PREFIX or invoke with full path.\n");
exit(PSEUDO_EXIT_PSEUDO_PREFIX);
}
+ free(s);
/* move database */
if (opt_m || opt_M) {
diff --git a/pseudo_client.c b/pseudo_client.c
index eeb1fdc..6310b99 100644
--- a/pseudo_client.c
+++ b/pseudo_client.c
@@ -431,6 +431,7 @@ pseudo_profile_report(void) {
void
pseudo_init_client(void) {
char *env;
+ int need_free = 0;
pseudo_antimagic();
pseudo_new_pid();
@@ -450,9 +451,11 @@ pseudo_init_client(void) {
* or it may have gone away, in which case we'd enable
* pseudo (and cause it to reinit the defaults).
*/
+ need_free = 0;
env = getenv("PSEUDO_DISABLED");
if (!env) {
env = pseudo_get_value("PSEUDO_DISABLED");
+ need_free = 1;
}
if (env) {
int actually_disabled = 1;
@@ -487,15 +490,19 @@ pseudo_init_client(void) {
} else {
pseudo_set_value("PSEUDO_DISABLED", "0");
}
+ if (need_free)
+ free(env);
/* ALLOW_FSYNC is here because some crazy hosts will otherwise
* report incorrect values for st_size/st_blocks. I can sort of
* understand st_blocks, but bogus values for st_size? Not cool,
* dudes, not cool.
*/
+ need_free = 0;
env = getenv("PSEUDO_ALLOW_FSYNC");
if (!env) {
env = pseudo_get_value("PSEUDO_ALLOW_FSYNC");
+ need_free = 1;
} else {
pseudo_set_value("PSEUDO_ALLOW_FSYNC", env);
}
@@ -504,6 +511,8 @@ pseudo_init_client(void) {
} else {
pseudo_allow_fsync = 0;
}
+ if (need_free)
+ free(env);
/* in child processes, PSEUDO_UNLOAD may become set to
* some truthy value, in which case we're being asked to
diff --git a/pseudo_util.c b/pseudo_util.c
index 51c07c2..b6980c2 100644
--- a/pseudo_util.c
+++ b/pseudo_util.c
@@ -967,6 +967,7 @@ pseudo_setupenv() {
}
snprintf(newenv, len, "%s:%s64", libdir_path, libdir_path);
SETENV(PRELINK_PATH, newenv, 1);
+ free(newenv);
} else if (!strstr(ld_library_path, libdir_path)) {
size_t len = strlen(ld_library_path) + 1 + strlen(libdir_path) + 1 + (strlen(libdir_path) + 2) + 1;
char *newenv = malloc(len);
@@ -975,6 +976,7 @@ pseudo_setupenv() {
}
snprintf(newenv, len, "%s:%s:%s64", ld_library_path, libdir_path, libdir_path);
SETENV(PRELINK_PATH, newenv, 1);
+ free(newenv);
} else {
/* nothing to do, ld_library_path exists and contains
* our preferred path */