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
This commit is contained in:
Simon J. Gerraty 2021-01-14 17:33:05 -08:00
parent d1949353e5
commit b14cfecbf0

View File

@ -199,7 +199,7 @@ static int new_package(int, struct package **);
static struct tarfile *scan_tarfile(struct package *, struct tarfile *); static struct tarfile *scan_tarfile(struct package *, struct tarfile *);
static int 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; 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) { if (strcmp(fn, tf->tf_hdr.ut_name) == 0) {
f->f_fsdata = tf; f->f_fsdata = tf;
tf->tf_fp = 0; /* Reset the file pointer. */ 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); return (0);
} }
tf = scan_tarfile(package, tf); tf = scan_tarfile(package, tf);
@ -249,6 +260,12 @@ pkg_open(const char *fn, struct open_file *f)
return (errno); return (errno);
} }
static int
pkg_open(const char *fn, struct open_file *f)
{
return pkg_open_follow(fn, f, 0);
}
static int static int
pkg_close(struct open_file *f) pkg_close(struct open_file *f)
{ {