Skip to content

Commit

Permalink
repo: skip dead symlinks and symlinks pointing inside the repo
Browse files Browse the repository at this point in the history
  • Loading branch information
bapt committed Mar 12, 2021
1 parent 3372972 commit 727f1c9
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 2 deletions.
17 changes: 16 additions & 1 deletion libpkg/pkg_repo_create.c
Original file line number Diff line number Diff line change
@@ -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>
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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,
Expand Down
34 changes: 33 additions & 1 deletion tests/frontend/repo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ tests_init \
repo_v1 \
repo_v2 \
repo_multiversion \
repo_multiformat
repo_multiformat \
repo_symlinks

repo_v1_body() {
touch plop
Expand Down Expand Up @@ -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"
}

0 comments on commit 727f1c9

Please sign in to comment.