diff options
author | Fabian Groffen <grobian@gentoo.org> | 2019-11-25 20:33:28 +0100 |
---|---|---|
committer | Fabian Groffen <grobian@gentoo.org> | 2019-11-25 20:33:28 +0100 |
commit | 291f2707236477bc654976b70d68526cb3115531 (patch) | |
tree | 40a5178703aa36ee52ac0617c96e3327b5ca8c17 /main.c | |
parent | tests/quse: spit out some debugging for Travis run (diff) | |
download | portage-utils-291f2707236477bc654976b70d68526cb3115531.tar.gz portage-utils-291f2707236477bc654976b70d68526cb3115531.tar.bz2 portage-utils-291f2707236477bc654976b70d68526cb3115531.zip |
main: fix unintended memory freeing
env_vars keep pointers to global variables, so modifying those variables
is enough to change the values
Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 34 |
1 files changed, 25 insertions, 9 deletions
@@ -333,8 +333,7 @@ set_portage_env_var(env_vars *var, const char *value, const char *src) var->src = xstrdup(src); break; case _Q_ISTR: - strincr_var(var->name, value, var->value.s, &var->value_len); - if (strcmp(var->src, "built-in default") == 0) { + if (*var->value.s == NULL) { free(var->src); var->src = xstrdup(src); } else { @@ -344,6 +343,7 @@ set_portage_env_var(env_vars *var, const char *value, const char *src) free(var->src); var->src = p; } + strincr_var(var->name, value, var->value.s, &var->value_len); break; } } @@ -616,14 +616,30 @@ read_one_repos_conf(const char *repos_conf) xasprintf(&conf, "%s:location", repo); path = iniparser_getstring(dict, conf, NULL); if (path) { - void *ele = xarraypush_str(overlays, path); - xarraypush_str(overlay_names, repo); - xarraypush_str(overlay_src, repos_conf); - if (main_repo && !strcmp(repo, main_repo)) { - main_overlay = ele; - set_portage_env_var(&vars_to_read[11] /* PORTDIR */, - main_overlay, repos_conf); + void *ele; + size_t n; + char *overlay; + + array_for_each(overlay_names, n, overlay) { + if (strcmp(overlay, repo) == 0) + break; + overlay = NULL; } + if (overlay != NULL) { + /* replace overlay */ + ele = array_get_elem(overlay_src, n); + free(ele); + array_get_elem(overlay_src, n) = xstrdup(repos_conf); + ele = array_get_elem(overlays, n); + free(ele); + ele = array_get_elem(overlays, n) = xstrdup(path); + } else { + ele = xarraypush_str(overlays, path); + xarraypush_str(overlay_names, repo); + xarraypush_str(overlay_src, repos_conf); + } + if (main_repo && strcmp(repo, main_repo) == 0) + main_overlay = ele; } free(conf); } |