Commit 727f1c94 authored by Baptiste Daroussin's avatar Baptiste Daroussin
Browse files

repo: skip dead symlinks and symlinks pointing inside the repo

parent 33729720
/*-
* 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,
......
......@@ -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"
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment