Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
repo: skip dead symlinks and symlinks pointing inside the repo
Baptiste Daroussin committed 5 years ago
commit 727f1c948eb5fe2d16c867db9e195c50166bf903
parent 3372972
2 files changed +49 -2
modified libpkg/pkg_repo_create.c
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2019 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2021 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
 * Copyright (c) 2012-2013 Matthew Seaman <matthew@FreeBSD.org>
@@ -218,7 +218,14 @@ pkg_create_repo_read_fts(struct pkg_fts_item **items, FTS *fts,
	char *ext;
	int linklen = 0;
	char tmp_name[MAXPATHLEN] = { 0 };
+
	char repo_path[MAXPATHLEN];
+
	size_t repo_path_len;

+
	if (realpath(repopath, repo_path) == NULL) {
+
		pkg_emit_errno("invalid repo path", repopath);
+
		return (EPKG_FATAL);
+
	}
+
	repo_path_len = strlen(repo_path);
	errno = 0;

	while ((fts_ent = fts_read(fts)) != NULL) {
@@ -246,6 +253,14 @@ pkg_create_repo_read_fts(struct pkg_fts_item **items, FTS *fts,
		}
		/* Follow symlinks. */
		if (fts_ent->fts_info == FTS_SL) {
+
			/*
+
			 * Skip symlinks pointing inside the repo
+
			 * and dead symlinks
+
			 */
+
			if (realpath(fts_ent->fts_path, tmp_name) == NULL)
+
				continue;
+
			if (strncmp(repo_path, tmp_name, repo_path_len) == 0)
+
				continue;
			/* Skip symlinks to hashed packages */
			if (meta->hash) {
				linklen = readlink(fts_ent->fts_path,
modified tests/frontend/repo.sh
@@ -6,7 +6,8 @@ tests_init \
	repo_v1 \
	repo_v2 \
	repo_multiversion \
-
	repo_multiformat
+
	repo_multiformat \
+
	repo_symlinks

repo_v1_body() {
	touch plop
@@ -181,3 +182,34 @@ EOF
	atf_check -o match:"Installing plop-1\.1" \
		pkg -C ./pkg.conf install -y plop
}
+

+
repo_symlinks_body() {
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg test test 1.0 "${TMPDIR}"
+
	atf_check pkg create --format txz -M test.ucl
+
	mkdir repo
+
	ln -sf ../test-1.0.txz ./repo/meh-1.0.txz
+
	atf_check -o ignore pkg repo repo
+
	cat > pkg.conf << EOF
+
PKG_DBDIR=${TMPDIR}
+
REPOS_DIR=[]
+
repositories: {
+
	local: { url : file://${TMPDIR}/repo }
+
}
+
EOF
+

+
	atf_check -o ignore \
+
		pkg -C ./pkg.conf update
+
	atf_check -o inline:"test\n" \
+
		pkg -C ./pkg.conf rquery -a "%n"
+

+
	rm -rf repo
+
	mkdir repo
+
	cp test-1.0.txz repo/
+
	ln -fs test-1.0.txz ./repo/meh-1.0.txz
+

+
	atf_check -o ignore pkg repo repo
+
	atf_check -o ignore \
+
		pkg -C ./pkg.conf update -f
+
	atf_check -o inline:"test\n" \
+
		pkg -C ./pkg.conf rquery -a "%n"
+
}