Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
add: ignore dead symlinks for provides/requires
Baptiste Daroussin committed 1 month ago
commit 4b0ddcef5810334090887df00975d5b7aa41c43b
parent a8e6f14
2 files changed +49 -1
modified libpkg/pkg_add.c
@@ -1165,12 +1165,18 @@ select_provider_from_dir(const char *dirpath, const char *ext)
		return (NULL);

	charv_t entries = vec_init();
+
	char fullpath[MAXPATHLEN];
	struct dirent *de;
	while ((de = readdir(d)) != NULL) {
		if (de->d_name[0] == '.')
			continue;
		if (!str_ends_with(de->d_name, ext))
			continue;
+
		/* Skip dangling symlinks */
+
		snprintf(fullpath, sizeof(fullpath), "%s/%s",
+
		    dirpath, de->d_name);
+
		if (access(fullpath, F_OK) != 0)
+
			continue;
		vec_push(&entries, xstrdup(de->d_name));
	}
	closedir(d);
modified tests/frontend/add.sh
@@ -21,7 +21,8 @@ tests_init \
		add_shlib_accept_missing \
		add_shlib_already_installed \
		add_provides_requires \
-
		add_shlib_stdin_skip
+
		add_shlib_stdin_skip \
+
		add_shlib_dead_symlink

initialize_pkg() {
	touch a
@@ -546,3 +547,44 @@ add_shlib_stdin_skip_body() {
		-s exit:0 \
		pkg add - < All/consumer-1.pkg
}
+

+
add_shlib_dead_symlink_body() {
+
	atf_skip_on Darwin "The macOS linker uses different flags"
+
	mkdir -p All
+
	create_shlibs
+

+
	# Provider package
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg provider provider 1 /usr/local
+
	cat << EOF >> provider.ucl
+
files: {
+
	$(pwd)/libtest.so.1: "",
+
}
+
EOF
+
	atf_check -o ignore -e empty -s exit:0 \
+
		pkg create -M provider.ucl
+
	mv provider-1.pkg All/
+

+
	# Consumer package
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg consumer consumer 1 /usr/local
+
	cat << EOF >> consumer.ucl
+
files: {
+
	$(pwd)/libconsumer.so.1: "",
+
}
+
EOF
+
	atf_check -o ignore -e empty -s exit:0 \
+
		pkg create -M consumer.ucl
+
	mv consumer-1.pkg All/
+

+
	# Symlink dir with one dead symlink and one valid one
+
	mkdir -p shlibs/libtest.so.1
+
	ln -s ../../All/nonexistent-1.pkg shlibs/libtest.so.1/dead.pkg
+
	ln -s ../../All/provider-1.pkg shlibs/libtest.so.1/provider.pkg
+

+
	# Dead symlink should be ignored, valid provider used
+
	atf_check \
+
		-o match:"Installing provider-1" \
+
		-o match:"Installing consumer-1" \
+
		-e empty \
+
		-s exit:0 \
+
		pkg add $(pwd)/All/consumer-1.pkg
+
}