diff options
author | Simon J. Gerraty <sjg@FreeBSD.org> | 2021-01-15 01:33:05 +0000 |
---|---|---|
committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2021-01-15 01:33:05 +0000 |
commit | b14cfecbf0ed04c841aa594dede3668b0a36344a (patch) | |
tree | 50d70c42600a5104587440b7d8423337d8afff8e /stand/libsa/pkgfs.c | |
parent | d1949353e5f57678f227b0b283cb63f367174e96 (diff) |
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
Diffstat (limited to 'stand/libsa/pkgfs.c')
-rw-r--r-- | stand/libsa/pkgfs.c | 19 |
1 files changed, 18 insertions, 1 deletions
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); @@ -250,6 +261,12 @@ pkg_open(const char *fn, struct open_file *f) } 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) { struct tarfile *tf; |