diff options
author | Fabian Groffen <grobian@gentoo.org> | 2019-11-29 14:18:37 +0100 |
---|---|---|
committer | Fabian Groffen <grobian@gentoo.org> | 2019-11-29 14:18:37 +0100 |
commit | 50b70d7c6696903440adde3a945af8bf298e1a0b (patch) | |
tree | fc5a85fb550aeeb090c2e4f9f04cce929401fa13 | |
parent | set_portage_env_var: don't include built-in value for incremental vars (diff) | |
download | portage-utils-50b70d7c.tar.gz portage-utils-50b70d7c.tar.bz2 portage-utils-50b70d7c.zip |
libq/tree: fix crash in tree_close_meta, bug #701470
_data member was used differently before, make sure we can free it
Bug: https://bugs.gentoo.org/701470
Signed-off-by: Fabian Groffen <grobian@gentoo.org>
-rw-r--r-- | libq/tree.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/libq/tree.c b/libq/tree.c index a3839505..cc8cf3e1 100644 --- a/libq/tree.c +++ b/libq/tree.c @@ -550,12 +550,11 @@ tree_read_file_pms(tree_pkg_ctx *pkg_ctx) len = sizeof(*ret) + s.st_size + 1; ret = xzalloc(len); - ptr = (char*)ret; - ret->_data = ptr + sizeof(*ret); - if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) + ptr = (char*)ret + sizeof(*ret); + if ((off_t)fread(ptr, 1, s.st_size, f) != s.st_size) goto err; - ret->DEPEND = ret->_data; + ret->DEPEND = ptr; #define next_line(curr, next) \ if ((ptr = strchr(ret->curr, '\n')) == NULL) { \ warn("Invalid cache file for '%s'", buf); \ @@ -618,9 +617,8 @@ tree_read_file_md5(tree_pkg_ctx *pkg_ctx) len = sizeof(*ret) + s.st_size + 1; ret = xzalloc(len); - ptr = (char*)ret; - ret->_data = ptr + sizeof(*ret); - if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) + ptr = (char*)ret + sizeof(*ret); + if ((off_t)fread(ptr, 1, s.st_size, f) != s.st_size) goto err; /* We have a block of key=value\n data. @@ -638,7 +636,6 @@ tree_read_file_md5(tree_pkg_ctx *pkg_ctx) #define assign_var(keyname) \ assign_var_cmp(keyname, #keyname); - ptr = ret->_data; endptr = strchr(ptr, '\0'); if (endptr == NULL) { warn("Invalid cache file for '%s/%s': " @@ -731,12 +728,10 @@ tree_read_file_ebuild(tree_pkg_ctx *pkg_ctx) len = sizeof(*ret) + s.st_size + 1; ret = xzalloc(len); - p = (char *)ret; - ret->_data = p + sizeof(*ret); - if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) + p = (char *)ret + sizeof(*ret); + if ((off_t)fread(p, 1, s.st_size, f) != s.st_size) goto err; - p = ret->_data; do { q = p; while (*p >= 'A' && *p <= 'Z') |