From b14cfecbf0ed04c841aa594dede3668b0a36344a Mon Sep 17 00:00:00 2001 From: "Simon J. Gerraty" Date: Thu, 14 Jan 2021 17:33:05 -0800 Subject: [PATCH] pkgfs_open: follow symlinks Caller is not interested in symlinks follow them. Throw an error if too many links encountered. Reviewed by: stevek Sponsored by: Juniper Networks --This line, and those below, will be ignored-- > Description of fields to fill in above: 76 columns --| > PR: If a GNATS PR is affected by the change. > Differential Revision: https://reviews.freebsd.org/D### (*full* phabric URL needed). > Submitted by: If someone else sent in the change. > Reviewed by: If someone else reviewed your modification. > Approved by: If you needed approval for this commit. > Obtained from: If the change is from a third party. > MFC after: N [day[s]|week[s]|month[s]]. Request a reminder email. > MFH: Ports tree branch name. Request approval for merge. > Relnotes: Set to 'yes' for mention in release notes. > Security: Vulnerability reference (one per line) or description. > Sponsored by: If the change was sponsored by an organization. > Empty fields above will be automatically removed. Change-Id: I4ef92ff256f503c620dc5bba79ed93b32cb2330d --- stand/libsa/pkgfs.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/stand/libsa/pkgfs.c b/stand/libsa/pkgfs.c index 8018edd60d57..ffa16309ee6a 100644 --- a/stand/libsa/pkgfs.c +++ b/stand/libsa/pkgfs.c @@ -199,7 +199,7 @@ static int new_package(int, struct package **); static struct tarfile *scan_tarfile(struct package *, struct tarfile *); static int -pkg_open(const char *fn, struct open_file *f) +pkg_open_follow(const char *fn, struct open_file *f, int lnks) { struct tarfile *tf; @@ -242,6 +242,17 @@ pkg_open(const char *fn, struct open_file *f) if (strcmp(fn, tf->tf_hdr.ut_name) == 0) { f->f_fsdata = tf; tf->tf_fp = 0; /* Reset the file pointer. */ + DBG(("%s: found %s type %c\n", __func__, + fn, tf->tf_hdr.ut_typeflag[0])); + if (tf->tf_hdr.ut_typeflag[0] == '2') { + /* we have a symlink + * Note: ut_linkname is only 100 chars! + */ + if (lnks++ >= 8) + return (EMLINK); + return pkg_open_follow(tf->tf_hdr.ut_linkname, + f, lnks); + } return (0); } tf = scan_tarfile(package, tf); @@ -249,6 +260,12 @@ pkg_open(const char *fn, struct open_file *f) return (errno); } +static int +pkg_open(const char *fn, struct open_file *f) +{ + return pkg_open_follow(fn, f, 0); +} + static int pkg_close(struct open_file *f) {