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:
parent
d1949353e5
commit
b14cfecbf0
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user