From nobody Fri Oct 08 16:08:56 2021 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id E3C5C17E962E; Fri, 8 Oct 2021 16:08:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4HQtRF1wJfz4jkS; Fri, 8 Oct 2021 16:08:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id B7CDF202B; Fri, 8 Oct 2021 16:08:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 198G8ukx001885; Fri, 8 Oct 2021 16:08:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 198G8unB001884; Fri, 8 Oct 2021 16:08:56 GMT (envelope-from git) Date: Fri, 8 Oct 2021 16:08:56 GMT Message-Id: <202110081608.198G8unB001884@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kyle Evans Subject: git: a4325c6a6552 - stable/12 - pkgfs_open: follow symlinks List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: a4325c6a6552f53325e42379163873c0453bacb1 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/12 has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=a4325c6a6552f53325e42379163873c0453bacb1 commit a4325c6a6552f53325e42379163873c0453bacb1 Author: Simon J. Gerraty AuthorDate: 2021-01-15 01:33:05 +0000 Commit: Kyle Evans 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) {