Gentoo Archives: gentoo-commits

From: Fabian Groffen <grobian@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage-utils:master commit in: /, tests/qmerge/, tests/quse/, libq/
Date: Sat, 30 Nov 2019 16:26:57
Message-Id: 1575131203.d1442dee24b0760665a103c5c1b3ad838eef02f9.grobian@gentoo
1 commit: d1442dee24b0760665a103c5c1b3ad838eef02f9
2 Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
3 AuthorDate: Sat Nov 30 16:25:18 2019 +0000
4 Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
5 CommitDate: Sat Nov 30 16:26:43 2019 +0000
6 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=d1442dee
7
8 misc fixes for valgrind
9
10 mainly memory and socket leaks, sometimes using invalid data, this is
11 related to bug #701402
12
13 Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
14
15 libq/atom.c | 5 +++++
16 main.c | 58 +++++++++++++++++++++++++++++++++++++++--------------
17 q.c | 4 ++--
18 qatom.c | 2 +-
19 qdepends.c | 14 +++++++++----
20 qlop.c | 39 ++++++++++++++++++++++++++++++++++-
21 qmanifest.c | 49 ++++++++++++++++++++++++++++++--------------
22 qmerge.c | 11 ++++++++--
23 tests/qmerge/dotest | 25 +++++++++++++----------
24 tests/quse/dotest | 4 ++++
25 10 files changed, 160 insertions(+), 51 deletions(-)
26
27 diff --git a/libq/atom.c b/libq/atom.c
28 index 6e12c0a..efd32d1 100644
29 --- a/libq/atom.c
30 +++ b/libq/atom.c
31 @@ -335,6 +335,11 @@ atom_implode(depend_atom *atom)
32 {
33 if (!atom)
34 errf("Atom is empty !");
35 + while (atom->usedeps != NULL) {
36 + atom_usedep *n = atom->usedeps->next;
37 + free(atom->usedeps);
38 + atom->usedeps = n;
39 + }
40 free(atom->suffixes);
41 free(atom);
42 }
43
44 diff --git a/main.c b/main.c
45 index ba15c8c..d6bbacf 100644
46 --- a/main.c
47 +++ b/main.c
48 @@ -224,8 +224,6 @@ makeargv(const char *string, int *argc, char ***argv)
49
50 *argc = 1;
51 (*argv)[0] = xstrdup(argv0);
52 - q = xstrdup(string);
53 - str = q;
54
55 /* shortcut empty strings */
56 while (isspace((int)*string))
57 @@ -233,6 +231,9 @@ makeargv(const char *string, int *argc, char ***argv)
58 if (*string == '\0')
59 return;
60
61 + q = xstrdup(string);
62 + str = q;
63 +
64 remove_extra_space(str);
65 rmspace(str);
66
67 @@ -744,18 +745,44 @@ initialize_portage_env(void)
68 snprintf(pathbuf, sizeof(pathbuf), "%.*s", (int)i, configroot);
69 read_repos_conf(pathbuf, "/usr/share/portage/config/repos.conf");
70 read_repos_conf(pathbuf, "/etc/portage/repos.conf");
71 - if (orig_main_overlay != main_overlay)
72 - free(orig_main_overlay);
73 - if (array_cnt(overlays) == 0) {
74 - xarraypush_ptr(overlays, main_overlay);
75 - xarraypush_str(overlay_names, "<PORTDIR>");
76 - xarraypush_str(overlay_src, STR_DEFAULT);
77 - } else if (orig_main_overlay == main_overlay) {
78 - /* if no explicit overlay was flagged as main, take the first one */
79 + /* special handling of PORTDIR envvar, else it comes too late, see
80 + * also below where we handle the environment */
81 + if ((s = getenv("PORTDIR")) != NULL) {
82 + char *overlay;
83 +
84 + array_for_each(overlays, i, overlay) {
85 + if (strcmp(overlay, s) == 0)
86 + break;
87 + overlay = NULL;
88 + }
89 + if (overlay == NULL) {
90 + main_overlay = xarraypush_str(overlays, s);
91 + xarraypush_str(overlay_names, "<PORTDIR>");
92 + xarraypush_str(overlay_src, "PORTDIR");
93 + } else {
94 + free(array_get_elem(overlay_src, i));
95 + array_get_elem(overlay_src, i) = xstrdup("PORTDIR");
96 + main_overlay = overlay;
97 + }
98 + free(vars_to_read[11 /* PORTDIR */].src);
99 + vars_to_read[11 /* PORTDIR */].src = xstrdup("PORTDIR");
100 + }
101 + if (orig_main_overlay != main_overlay) {
102 free(orig_main_overlay);
103 - main_overlay = array_get_elem(overlays, 0);
104 - set_portage_env_var(&vars_to_read[11] /* PORTDIR */, main_overlay,
105 - (char *)array_get_elem(overlay_src, 0));
106 + } else {
107 + if (array_cnt(overlays) == 0) {
108 + xarraypush_ptr(overlays, main_overlay);
109 + xarraypush_str(overlay_names, "<PORTDIR>");
110 + xarraypush_str(overlay_src, STR_DEFAULT);
111 + } else {
112 + /* if no explicit overlay was flagged as main, take the
113 + * first one */
114 + free(orig_main_overlay);
115 + main_overlay = array_get_elem(overlays, 0);
116 + free(vars_to_read[11 /* PORTDIR */].src);
117 + vars_to_read[11 /* PORTDIR */].src =
118 + xstrdup((char *)array_get_elem(overlay_src, 0));
119 + }
120 }
121
122 /* consider Portage's defaults */
123 @@ -781,10 +808,11 @@ initialize_portage_env(void)
124 read_portage_env_file(pathbuf, vars_to_read);
125
126 /* finally, check the env */
127 - for (i = 0; vars_to_read[i].name; ++i) {
128 + for (i = 0; vars_to_read[i].name; i++) {
129 var = &vars_to_read[i];
130 s = getenv(var->name);
131 - if (s != NULL)
132 + /* PORTDIR was already added to overlays above, ignore it */
133 + if (s != NULL && strcmp(var->name, "PORTDIR") != 0)
134 set_portage_env_var(var, s, var->name);
135 }
136
137
138 diff --git a/q.c b/q.c
139 index 40cdc2a..a974df8 100644
140 --- a/q.c
141 +++ b/q.c
142 @@ -238,12 +238,12 @@ int q_main(int argc, char **argv)
143
144 switch (var->type) {
145 case _Q_BOOL:
146 - printf("%s%s%s\n",
147 + printf("%s%s%s",
148 YELLOW, *var->value.b ? "1" : "0", NORM);
149 break;
150 case _Q_STR:
151 case _Q_ISTR:
152 - printf("%s%s%s\n", RED, *var->value.s, NORM);
153 + printf("%s%s%s", RED, *var->value.s, NORM);
154 break;
155 }
156 if (verbose)
157
158 diff --git a/qatom.c b/qatom.c
159 index 4ad6116..23d10d8 100644
160 --- a/qatom.c
161 +++ b/qatom.c
162 @@ -55,7 +55,7 @@ int qatom_main(int argc, char **argv)
163 if (action == _COMPARE && (argc - optind) % 2)
164 err("compare needs even number of arguments");
165
166 - for (i = optind; i < argc; ++i) {
167 + for (i = optind; i < argc; i++) {
168 atom = atom_explode(argv[i]);
169 if (atom == NULL) {
170 warnf("invalid atom: %s\n", argv[i]);
171
172 diff --git a/qdepends.c b/qdepends.c
173 index b5e8993..6f89835 100644
174 --- a/qdepends.c
175 +++ b/qdepends.c
176 @@ -345,17 +345,23 @@ int qdepends_main(int argc, char **argv)
177 state.qmode &= ~QMODE_INSTALLED;
178 }
179
180 - if ((argc == optind) && !do_pretty)
181 + if ((argc == optind) && !do_pretty) {
182 + free_set(state.udeps);
183 qdepends_usage(EXIT_FAILURE);
184 + }
185
186 if (do_pretty) {
187 + ret = EXIT_SUCCESS;
188 while (optind < argc) {
189 - if (!qdepends_print_depend(stdout, argv[optind++]))
190 - return EXIT_FAILURE;
191 + if (!qdepends_print_depend(stdout, argv[optind++])) {
192 + ret = EXIT_FAILURE;
193 + break;
194 + }
195 if (optind < argc)
196 fprintf(stdout, "\n");
197 }
198 - return EXIT_SUCCESS;
199 + free_set(state.udeps);
200 + return ret;
201 }
202
203 argc -= optind;
204
205 diff --git a/qlop.c b/qlop.c
206 index dcf1d47..d8e1d58 100644
207 --- a/qlop.c
208 +++ b/qlop.c
209 @@ -1014,6 +1014,42 @@ static int do_emerge_log(
210 printf("\n");
211 }
212 }
213 +
214 + {
215 + DECLARE_ARRAY(t);
216 + values_set(merge_averages, t);
217 + array_for_each(t, i, pkgw) {
218 + atom_implode(pkgw->atom);
219 + free(pkgw);
220 + }
221 + xarrayfree_int(t);
222 + values_set(unmerge_averages, t);
223 + array_for_each(t, i, pkgw) {
224 + atom_implode(pkgw->atom);
225 + free(pkgw);
226 + }
227 + xarrayfree_int(t);
228 + }
229 + free_set(merge_averages);
230 + free_set(unmerge_averages);
231 + array_for_each_rev(merge_matches, i, pkgw) {
232 + atom_implode(pkgw->atom);
233 + xarraydelete(merge_matches, i);
234 + }
235 + xarrayfree(merge_matches);
236 + array_for_each_rev(unmerge_matches, i, pkgw) {
237 + atom_implode(pkgw->atom);
238 + xarraydelete(unmerge_matches, i);
239 + }
240 + xarrayfree(unmerge_matches);
241 + if (atomset != NULL) {
242 + DECLARE_ARRAY(t);
243 + values_set(atomset, t);
244 + array_for_each(t, i, atom)
245 + atom_implode(atom);
246 + xarrayfree_int(t);
247 + free_set(atomset);
248 + }
249 return 0;
250 }
251
252 @@ -1073,7 +1109,8 @@ static array_t *probe_proc(array_t *atoms)
253 rpath[rpathlen] = '\0';
254 /* check if this points to a portage build:
255 * <somepath>/portage/<cat>/<pf>/temp/build.log */
256 - if (strcmp(rpath + rpathlen -
257 + if (rpathlen > sizeof("/temp/build.log") &&
258 + strcmp(rpath + rpathlen -
259 (sizeof("/temp/build.log") - 1),
260 "/temp/build.log") == 0 &&
261 (p = strstr(rpath, "/portage/")) != NULL)
262
263 diff --git a/qmanifest.c b/qmanifest.c
264 index fee0151..c4c1322 100644
265 --- a/qmanifest.c
266 +++ b/qmanifest.c
267 @@ -752,6 +752,7 @@ process_dir_gen(void)
268 gerr = gpgme_signers_add(gctx, gkey);
269 if (gerr != GPG_ERR_NO_ERROR)
270 return "failed to add GPG key to sign list, is it a suitable key?";
271 + gpgme_key_unref(gkey);
272
273 gpg_pass = NULL;
274 if (gpg_get_password) {
275 @@ -859,11 +860,6 @@ verify_gpg_sig(const char *path, verify_msg **msgs)
276 struct tm *ctime;
277 gpg_sig *ret = NULL;
278
279 - if ((f = fopen(path, "r")) == NULL) {
280 - msgs_add(msgs, path, NULL, "failed to open: %s", strerror(errno));
281 - return NULL;
282 - }
283 -
284 if (gpgme_new(&g_ctx) != GPG_ERR_NO_ERROR) {
285 msgs_add(msgs, path, NULL, "failed to create gpgme context");
286 return NULL;
287 @@ -871,17 +867,32 @@ verify_gpg_sig(const char *path, verify_msg **msgs)
288
289 if (gpgme_data_new(&out) != GPG_ERR_NO_ERROR) {
290 msgs_add(msgs, path, NULL, "failed to create gpgme data");
291 + gpgme_release(g_ctx);
292 + return NULL;
293 + }
294 +
295 + if ((f = fopen(path, "r")) == NULL) {
296 + msgs_add(msgs, path, NULL, "failed to open: %s", strerror(errno));
297 + gpgme_data_release(out);
298 + gpgme_release(g_ctx);
299 return NULL;
300 }
301
302 if (gpgme_data_new_from_stream(&manifest, f) != GPG_ERR_NO_ERROR) {
303 msgs_add(msgs, path, NULL,
304 "failed to create new gpgme data from stream");
305 + gpgme_data_release(out);
306 + gpgme_release(g_ctx);
307 + fclose(f);
308 return NULL;
309 }
310
311 if (gpgme_op_verify(g_ctx, manifest, NULL, out) != GPG_ERR_NO_ERROR) {
312 msgs_add(msgs, path, NULL, "failed to verify signature");
313 + gpgme_data_release(out);
314 + gpgme_data_release(manifest);
315 + gpgme_release(g_ctx);
316 + fclose(f);
317 return NULL;
318 }
319
320 @@ -891,6 +902,9 @@ verify_gpg_sig(const char *path, verify_msg **msgs)
321 if (vres == NULL || vres->signatures == NULL) {
322 msgs_add(msgs, path, NULL,
323 "verification failed due to a missing gpg keyring");
324 + gpgme_data_release(out);
325 + gpgme_data_release(manifest);
326 + gpgme_release(g_ctx);
327 return NULL;
328 }
329
330 @@ -971,6 +985,8 @@ verify_gpg_sig(const char *path, verify_msg **msgs)
331 }
332 }
333
334 + gpgme_data_release(out);
335 + gpgme_data_release(manifest);
336 gpgme_release(g_ctx);
337
338 return ret;
339 @@ -1529,8 +1545,10 @@ process_dir_vrfy(void)
340 char *timestamp;
341 verify_msg topmsg;
342 verify_msg *walk = &topmsg;
343 + verify_msg *next;
344 gpg_sig *gs;
345
346 + walk->next = NULL;
347 gettimeofday(&startt, NULL);
348
349 snprintf(buf, sizeof(buf), "metadata/layout.conf");
350 @@ -1581,10 +1599,12 @@ process_dir_vrfy(void)
351 * be there
352 * - recurse into directories for which Manifest files are defined
353 */
354 - walk->next = NULL;
355 if (verify_manifest(".\0", str_manifest, &walk) != 0)
356 ret = "manifest verification failed";
357
358 + gettimeofday(&finisht, NULL);
359 +
360 + /* produce a report */
361 {
362 char *mfest;
363 char *ebuild;
364 @@ -1593,7 +1613,6 @@ process_dir_vrfy(void)
365 char *lastebuild = (char *)"-";
366 char *msgline;
367 const char *pfx;
368 - verify_msg *next;
369
370 for (walk = topmsg.next; walk != NULL; walk = walk->next) {
371 mfest = walk->msg;
372 @@ -1651,16 +1670,16 @@ process_dir_vrfy(void)
373 format_line(pfx, msg);
374 }
375 }
376 -
377 - walk = topmsg.next;
378 - while (walk != NULL) {
379 - next = walk->next;
380 - free(walk);
381 - walk = next;
382 - }
383 }
384
385 - gettimeofday(&finisht, NULL);
386 + /* clean up messages */
387 + walk = topmsg.next;
388 + while (walk != NULL) {
389 + next = walk->next;
390 + free(walk->msg);
391 + free(walk);
392 + walk = next;
393 + }
394
395 etime = ((double)((finisht.tv_sec - startt.tv_sec) * 1000000 +
396 finisht.tv_usec) - (double)startt.tv_usec) / 1000000.0;
397
398 diff --git a/qmerge.c b/qmerge.c
399 index c7b234e..5b7a298 100644
400 --- a/qmerge.c
401 +++ b/qmerge.c
402 @@ -481,6 +481,7 @@ install_mask_check_dir(
403 *npth = '\0';
404 }
405 }
406 + scandir_free(files, cnt);
407 }
408
409 static void
410 @@ -620,6 +621,9 @@ install_mask_pwd(int iargc, char **iargv, const struct stat * const st, int fd)
411 qpth[cnt] = '\0';
412
413 install_mask_check_dir(masksv, masksc, st, fd, 1, INCLUDE, qpth);
414 +
415 + free(masks);
416 + free(masksv);
417 }
418
419 static char
420 @@ -917,11 +921,13 @@ merge_tree_at(int fd_src, const char *src, int fd_dst, const char *dst,
421
422 /* Make sure owner/mode is sane before we write out data */
423 if (fchown(fd_dstf, st.st_uid, st.st_gid)) {
424 - warnp("could not set ownership %s", cpath);
425 + warnp("could not set ownership (%zu/%zu) for %s",
426 + (size_t)st.st_uid, (size_t)st.st_gid, cpath);
427 continue;
428 }
429 if (fchmod(fd_dstf, st.st_mode)) {
430 - warnp("could not set permission %s", cpath);
431 + warnp("could not set permission (%u) for %s",
432 + (int)st.st_mode, cpath);
433 continue;
434 }
435
436 @@ -1439,6 +1445,7 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
437 printf("%s>>>%s %s%s%s/%s%s%s\n",
438 YELLOW, NORM, WHITE, atom->CATEGORY, NORM, CYAN, pkg->PF, NORM);
439
440 + tree_close_cat(cat_ctx);
441 tree_close(vdb);
442 }
443
444
445 diff --git a/tests/qmerge/dotest b/tests/qmerge/dotest
446 index 86c6147..1563595 100755
447 --- a/tests/qmerge/dotest
448 +++ b/tests/qmerge/dotest
449 @@ -20,17 +20,20 @@ mkdir -p "${ROOT}/var/db/pkg"
450
451 set +e
452
453 +# sanity check on environment
454 +q -Cev
455 +
456 # Do a merge into an empty tree.
457
458 out=$(yes | qmerge -F qmerge-test)
459 -tend $? "qmerge-test: [N] basic merge" || echo "${out}"
460 +tend $? "qmerge-test: [N] basic merge" || die "${out}"
461
462 [[ ${out} != *"FAIL"* ]]
463 -tend $? "qmerge-test: [N] FAIL messages" || echo "${out}"
464 +tend $? "qmerge-test: [N] FAIL messages" || die "${out}"
465
466 order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }')
467 [[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]]
468 -tend $? "qmerge-test: [N] pkg_* order of execution" || printf '%s\n' "${order}" "${out}"
469 +tend $? "qmerge-test: [N] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"
470
471 ls -d "${ROOT}"/var/db/pkg/sys-devel/qmerge-test-* >/dev/null
472 tend $? "qmerge-test: [N] vdb installed"
473 @@ -38,25 +41,25 @@ tend $? "qmerge-test: [N] vdb installed"
474 [[ -x ${ROOT}/usr/bin/qmerge-test && \
475 -f ${ROOT}/etc/some.conf && \
476 -f ${ROOT}/etc/another.conf ]]
477 -tend $? "qmerge-test: [N] installed expected files" || treedir "${ROOT}"
478 +tend $? "qmerge-test: [N] installed expected files" || die "$(treedir "${ROOT}")"
479
480 # Now do a re-emerge.
481
482 out=$(yes | qmerge -F qmerge-test)
483 -tend $? "qmerge-test: [R] re-emerge" || echo "${out}"
484 +tend $? "qmerge-test: [R] re-emerge" || die "${out}"
485
486 [[ -x ${ROOT}/usr/bin/qmerge-test ]]
487 -tend $? "qmerge-test: [R] installed expected files" || treedir "${ROOT}"
488 +tend $? "qmerge-test: [R] installed expected files" || die "$(treedir "${ROOT}")"
489
490 order=$(echo "${out}" | awk '$1 == ">>>" && $2 ~ /^pkg_/ { printf "%s ", $NF }')
491 [[ ${order} == "pkg_pretend pkg_setup pkg_preinst pkg_postinst " ]]
492 -tend $? "qmerge-test: [R] pkg_* order of execution" || printf '%s\n' "${order}" "${out}"
493 +tend $? "qmerge-test: [R] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"
494
495 [[ -x ${ROOT}/usr/bin/qmerge-test && \
496 -f ${ROOT}/etc/some.conf && \
497 -f ${ROOT}/etc/another.conf && \
498 -f ${ROOT}/etc/._cfg0000_some.conf ]]
499 -tend $? "qmerge-test: [R] re-installed expected files" || treedir "${ROOT}"
500 +tend $? "qmerge-test: [R] re-installed expected files" || die "$(treedir "${ROOT}")"
501
502 # Finally do an unmerge.
503
504 @@ -64,17 +67,17 @@ echo alkdsjfalksdf > "${ROOT}/etc/some.conf"
505
506 rm -f "${ROOT}/etc/._cfg0000_some.conf"
507 out=$(yes | qmerge -FU qmerge-test)
508 -tend $? "qmerge-test: [C] uninstall" || echo "${out}"
509 +tend $? "qmerge-test: [C] uninstall" || die "${out}"
510
511 order=$(echo "${out}" | awk '$1 == ">>>" { printf "%s ", $NF }')
512 [[ ${order} == "pkg_prerm pkg_postrm " ]]
513 -tend $? "qmerge-test: [C] pkg_* order of execution" || printf '%s\n' "${order}" "${out}"
514 +tend $? "qmerge-test: [C] pkg_* order of execution" || die "$(printf '%s\n' "${order}" "${out}")"
515
516 [[ ! -x ${ROOT}/usr/bin/qmerge-test && \
517 -f ${ROOT}/etc/some.conf && \
518 ! -f ${ROOT}/etc/another.conf && \
519 ! -d ${ROOT}/var/db/pkg/sys-devel ]]
520 -tend $? "qmerge-test: [C] uninstalled expected files" || treedir "${ROOT}"
521 +tend $? "qmerge-test: [C] uninstalled expected files" || die "$(treedir "${ROOT}")"
522
523 set -e
524
525
526 diff --git a/tests/quse/dotest b/tests/quse/dotest
527 index ada7bd9..93bef56 100755
528 --- a/tests/quse/dotest
529 +++ b/tests/quse/dotest
530 @@ -8,6 +8,10 @@ mktmpdir
531
532 mkportdir "${as}/portdir"
533
534 +# check inference of PORTDIR with repos.conf
535 +q -evC PORTDIR
536 +q -ovC
537 +
538 d=${PORTDIR}/profiles
539 entries() {
540 sed -e 's:#.*::' -e '/^$/d' "$1"