Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
shlibs: also remove ignored shlibs provided from shlibs required
Baptiste Daroussin committed 21 days ago
commit 4701646a73464d554ee31ecd5d0b77e642b33fbb
parent a5a5bf9
2 files changed +60 -2
modified libpkg/pkg_abi.c
@@ -465,7 +465,8 @@ pkg_cleanup_shlibs_required(struct pkg *pkg, charv_t *internal_provided)
	vec_foreach(pkg->shlibs_required, i) {
		char *s = pkg->shlibs_required.d[i];
		if (charv_search(&pkg->shlibs_provided, s) != NULL ||
-
		    charv_search(internal_provided, s) != NULL) {
+
		    charv_search(internal_provided, s) != NULL ||
+
		    charv_search(&pkg->shlibs_provided_ignore, s) != NULL) {
			pkg_debug(2,
			    "remove %s from required shlibs as the "
			    "package %s provides this library itself",
@@ -614,7 +615,9 @@ pkg_analyse_files(struct pkgdb *db __unused, struct pkg *pkg, const char *stage)
					vec_push(&maybe_provided, pkg_shlib_name_with_flags(provided, provided_flags));
				}
			} else {
-
				vec_push(&internal_provided, pkg_shlib_name_with_flags(provided, provided_flags));
+
				char *ip = pkg_shlib_name_with_flags(provided, provided_flags);
+
				if (charv_insert_sorted(&internal_provided, ip) != NULL)
+
					free(ip);
			}
			free(provided);
		}
modified tests/lib/shlibs.c
@@ -10,6 +10,8 @@
ATF_TC_WITHOUT_HEAD(cleanup_shlibs_required);
ATF_TC_WITHOUT_HEAD(cleanup_shlibs_required_multiple_provided);
ATF_TC_WITHOUT_HEAD(cleanup_shlibs_required_consecutive_provided);
+
ATF_TC_WITHOUT_HEAD(cleanup_shlibs_required_provided_ignore);
+
ATF_TC_WITHOUT_HEAD(cleanup_shlibs_required_internal_provided_sorted);

ATF_TC_BODY(cleanup_shlibs_required, tc)
{
@@ -75,11 +77,64 @@ ATF_TC_BODY(cleanup_shlibs_required_consecutive_provided, tc)
	ATF_REQUIRE_STREQ(p->shlibs_required.d[2], "libC.so.2");
}

+
ATF_TC_BODY(cleanup_shlibs_required_provided_ignore, tc)
+
{
+
	struct pkg *p;
+
	charv_t internal_provided = vec_init();
+

+
	ATF_REQUIRE_EQ(pkg_new(&p, PKG_FILE), EPKG_OK);
+
	ATF_REQUIRE(p != NULL);
+
	vec_push(&p->shlibs_required, xstrdup("lib1.so.1"));
+
	vec_push(&p->shlibs_required, xstrdup("libprivate.so.1"));
+
	vec_push(&p->shlibs_required, xstrdup("libother.so.2"));
+
	/* libprivate.so.1 is in shlibs_provided_ignore (e.g. from manifest
+
	 * or because it was not in SHLIB_PROVIDE_PATHS) */
+
	charv_insert_sorted(&p->shlibs_provided_ignore, xstrdup("libprivate.so.1"));
+
	ATF_REQUIRE_EQ(vec_len(&p->shlibs_required), 3);
+
	pkg_cleanup_shlibs_required(p, &internal_provided);
+
	ATF_REQUIRE_EQ(vec_len(&p->shlibs_required), 2);
+
	ATF_REQUIRE_STREQ(p->shlibs_required.d[0], "lib1.so.1");
+
	ATF_REQUIRE_STREQ(p->shlibs_required.d[1], "libother.so.2");
+
}
+

+
/*
+
 * Regression test: internal_provided must be sorted for charv_search
+
 * (bsearch) to work.  With multiple entries added in reverse order,
+
 * bsearch would silently fail to find valid entries if the vector
+
 * were unsorted.
+
 */
+
ATF_TC_BODY(cleanup_shlibs_required_internal_provided_sorted, tc)
+
{
+
	struct pkg *p;
+
	charv_t internal_provided = vec_init();
+

+
	ATF_REQUIRE_EQ(pkg_new(&p, PKG_FILE), EPKG_OK);
+
	ATF_REQUIRE(p != NULL);
+
	charv_insert_sorted(&p->shlibs_required, xstrdup("libA.so.1:32"));
+
	charv_insert_sorted(&p->shlibs_required, xstrdup("libM.so.2:32"));
+
	charv_insert_sorted(&p->shlibs_required, xstrdup("libZ.so.3:32"));
+
	charv_insert_sorted(&p->shlibs_required, xstrdup("libunrelated.so.1"));
+
	ATF_REQUIRE_EQ(vec_len(&p->shlibs_required), 4);
+

+
	/* Insert in reverse order to ensure sorting matters */
+
	charv_insert_sorted(&internal_provided, xstrdup("libZ.so.3:32"));
+
	charv_insert_sorted(&internal_provided, xstrdup("libM.so.2:32"));
+
	charv_insert_sorted(&internal_provided, xstrdup("libA.so.1:32"));
+

+
	pkg_cleanup_shlibs_required(p, &internal_provided);
+
	ATF_REQUIRE_EQ_MSG(vec_len(&p->shlibs_required), 1,
+
	    "expecting 1 got %zu", vec_len(&p->shlibs_required));
+
	ATF_REQUIRE_STREQ(p->shlibs_required.d[0], "libunrelated.so.1");
+
	vec_free_and_free(&internal_provided, free);
+
}
+

ATF_TP_ADD_TCS(tp)
{
	ATF_TP_ADD_TC(tp, cleanup_shlibs_required);
	ATF_TP_ADD_TC(tp, cleanup_shlibs_required_multiple_provided);
	ATF_TP_ADD_TC(tp, cleanup_shlibs_required_consecutive_provided);
+
	ATF_TP_ADD_TC(tp, cleanup_shlibs_required_provided_ignore);
+
	ATF_TP_ADD_TC(tp, cleanup_shlibs_required_internal_provided_sorted);

	return (atf_no_error());
}