The branch stable/12 has been updated by kevans:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=a4325c6a6552f53325e42379163873c0453bacb1

commit a4325c6a6552f53325e42379163873c0453bacb1
Author:     Simon J. Gerraty <s...@freebsd.org>
AuthorDate: 2021-01-15 01:33:05 +0000
Commit:     Kyle Evans <kev...@freebsd.org>
CommitDate: 2021-10-08 08:01:41 +0000

    pkgfs_open: follow symlinks
    
    Caller is not interested in symlinks follow them.
    Throw an error if too many links encountered.
    
    (cherry picked from commit b14cfecbf0ed04c841aa594dede3668b0a36344a)
---
 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 4f52b6bb6b9b..d0e083696b12 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)
 {

Reply via email to