1 |
commit: 50b70d7c6696903440adde3a945af8bf298e1a0b |
2 |
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Nov 29 13:18:37 2019 +0000 |
4 |
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Nov 29 13:18:37 2019 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=50b70d7c |
7 |
|
8 |
libq/tree: fix crash in tree_close_meta, bug #701470 |
9 |
|
10 |
_data member was used differently before, make sure we can free it |
11 |
|
12 |
Bug: https://bugs.gentoo.org/701470 |
13 |
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org> |
14 |
|
15 |
libq/tree.c | 19 +++++++------------ |
16 |
1 file changed, 7 insertions(+), 12 deletions(-) |
17 |
|
18 |
diff --git a/libq/tree.c b/libq/tree.c |
19 |
index a383950..cc8cf3e 100644 |
20 |
--- a/libq/tree.c |
21 |
+++ b/libq/tree.c |
22 |
@@ -550,12 +550,11 @@ tree_read_file_pms(tree_pkg_ctx *pkg_ctx) |
23 |
|
24 |
len = sizeof(*ret) + s.st_size + 1; |
25 |
ret = xzalloc(len); |
26 |
- ptr = (char*)ret; |
27 |
- ret->_data = ptr + sizeof(*ret); |
28 |
- if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) |
29 |
+ ptr = (char*)ret + sizeof(*ret); |
30 |
+ if ((off_t)fread(ptr, 1, s.st_size, f) != s.st_size) |
31 |
goto err; |
32 |
|
33 |
- ret->DEPEND = ret->_data; |
34 |
+ ret->DEPEND = ptr; |
35 |
#define next_line(curr, next) \ |
36 |
if ((ptr = strchr(ret->curr, '\n')) == NULL) { \ |
37 |
warn("Invalid cache file for '%s'", buf); \ |
38 |
@@ -618,9 +617,8 @@ tree_read_file_md5(tree_pkg_ctx *pkg_ctx) |
39 |
|
40 |
len = sizeof(*ret) + s.st_size + 1; |
41 |
ret = xzalloc(len); |
42 |
- ptr = (char*)ret; |
43 |
- ret->_data = ptr + sizeof(*ret); |
44 |
- if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) |
45 |
+ ptr = (char*)ret + sizeof(*ret); |
46 |
+ if ((off_t)fread(ptr, 1, s.st_size, f) != s.st_size) |
47 |
goto err; |
48 |
|
49 |
/* We have a block of key=value\n data. |
50 |
@@ -638,7 +636,6 @@ tree_read_file_md5(tree_pkg_ctx *pkg_ctx) |
51 |
#define assign_var(keyname) \ |
52 |
assign_var_cmp(keyname, #keyname); |
53 |
|
54 |
- ptr = ret->_data; |
55 |
endptr = strchr(ptr, '\0'); |
56 |
if (endptr == NULL) { |
57 |
warn("Invalid cache file for '%s/%s': " |
58 |
@@ -731,12 +728,10 @@ tree_read_file_ebuild(tree_pkg_ctx *pkg_ctx) |
59 |
|
60 |
len = sizeof(*ret) + s.st_size + 1; |
61 |
ret = xzalloc(len); |
62 |
- p = (char *)ret; |
63 |
- ret->_data = p + sizeof(*ret); |
64 |
- if ((off_t)fread(ret->_data, 1, s.st_size, f) != s.st_size) |
65 |
+ p = (char *)ret + sizeof(*ret); |
66 |
+ if ((off_t)fread(p, 1, s.st_size, f) != s.st_size) |
67 |
goto err; |
68 |
|
69 |
- p = ret->_data; |
70 |
do { |
71 |
q = p; |
72 |
while (*p >= 'A' && *p <= 'Z') |