From nobody Wed Feb 15 02:13:34 2023 X-Original-To: dev-commits-src-main@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 4PGhSt6R6Hz3qb6P; Wed, 15 Feb 2023 02:13:34 +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 4PGhSt5w59z4cY9; Wed, 15 Feb 2023 02:13:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1676427214; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=RL9h+KyfIDAHyyQdIlkP40PUg5ggRo920tTQqQKxsn0=; b=XNevxtq3vjtnzgGTCl9GFRwTZvp5dQo4K5k8+3GSgIH10fS+e4BIu/LOKxDu74zqJ+1uDL Te5jadV/EWOdL1uOEJV5Y0qGRuiZgl4o8HtkqFNYq+REH8Iv8jIRLgYKxskSITEeVz8v93 xOir50SDG5VlTE2FDcn63hpoAvWHCKziKoRToaCvahnnCR5o3SPEEOlUol25qBnivklG7l kiSKmw36G4Rro/C7ziIc45EFWgIK/QJkkPsPow8fp+Ha4S8LuN8cL2M4ejREWMYS1Pc7kg n7YtNSxJ+P9e4rQBmzn8KjxOBdJeHxlDuRsn/XF09FqXIF4P9D2EaDkjpTrUxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1676427214; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=RL9h+KyfIDAHyyQdIlkP40PUg5ggRo920tTQqQKxsn0=; b=xUzcQRC4pTGUI5nNMSwtpEqBFHUoRDU2lgGGsEHlS3Uu3nQ1CJJb8vMIquI/HDAaYR0Qfu pMKsPlMw8OLF5XHk4J5eIgve9lZDs9WtQxiAwKIH1XANyMOXbIy67/+juYA82ThdqN7f00 kKdPbPv8y8H7zEQalaTPGvbNX4iFSrTgx6pVjlcM0JdbtucCpQ+mFKclb2mHwocYa2CRBl Mh/hnlo/6z8qndfsbP0fAftoyd4qTd68t91zw/NLlozkbcZKmnyPbBaQUcHYCocs0KCgA2 JMLA+5zUlD1wtWeoxgsEqqY2ut9+KQfhIVJ6VRjGIAjJM3/7o9IF1dL9Zm0Uwg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1676427214; a=rsa-sha256; cv=none; b=VgkZPJT/WdWylTbJP1HKMw+SnEgdQSGRTuS8G8H28gNOlNm7YHs5rUQsgnIh2AgInjSzuL mVFdWPKMQGzHn0FI0hDHMXQ1pQtHqgOU16pQjpn/0kWRyKUoBr8gC05dKbU0sXIlieugOf 0wzs++IWxWsjY/sNYzkR+/8v+FYQRnGosMBLcDnbNdSGCnC42WMJMWXB3j+8B3ZfYTir+r OU3N+OCtNgTB8OCRyVKLH0Z2zJYnOaOXg5v0EgLn9VFRguVwuL1tqw2ONVKVCl/3y4l7So 1yY7FJ0eVaCx+RC+saphkoJq4zbGI2x8QOQA9JhAhLa6PgYMTSaD6yCVDDqKKQ== 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 4PGhSt4gSJz1M6d; Wed, 15 Feb 2023 02:13:34 +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 31F2DY2I062011; Wed, 15 Feb 2023 02:13:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 31F2DYAH062010; Wed, 15 Feb 2023 02:13:34 GMT (envelope-from git) Date: Wed, 15 Feb 2023 02:13:34 GMT Message-Id: <202302150213.31F2DYAH062010@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Dag-Erling=20Sm=C3=B8rgrav?= Subject: git: ae6cff89738b - main - tarfs: Don't panic if the parent of a new node is not a directory. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: des X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ae6cff89738bab9a4a956c230fb9dc6c4d5e113f Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=ae6cff89738bab9a4a956c230fb9dc6c4d5e113f commit ae6cff89738bab9a4a956c230fb9dc6c4d5e113f Author: Dag-Erling Smørgrav AuthorDate: 2023-02-15 02:12:45 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2023-02-15 02:13:11 +0000 tarfs: Don't panic if the parent of a new node is not a directory. PR: 269519 Sponsored by: Juniper Networks, Inc. Sponsored by: Klara, Inc. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D38587 --- sys/fs/tarfs/tarfs_subr.c | 3 ++- sys/fs/tarfs/tarfs_vfsops.c | 12 +++++++++++- tests/sys/fs/tarfs/tarfs_test.sh | 30 ++++++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/sys/fs/tarfs/tarfs_subr.c b/sys/fs/tarfs/tarfs_subr.c index fc2955b44606..0cba43a8c21b 100644 --- a/sys/fs/tarfs/tarfs_subr.c +++ b/sys/fs/tarfs/tarfs_subr.c @@ -171,6 +171,8 @@ tarfs_alloc_node(struct tarfs_mount *tmp, const char *name, size_t namelen, TARFS_DPF(ALLOC, "%s(%.*s)\n", __func__, (int)namelen, name); + if (parent != NULL && parent->type != VDIR) + return (ENOTDIR); tnp = malloc(sizeof(struct tarfs_node), M_TARFSNODE, M_WAITOK | M_ZERO); mtx_init(&tnp->lock, "tarfs node lock", NULL, MTX_DEF); tnp->gen = arc4random(); @@ -233,7 +235,6 @@ tarfs_alloc_node(struct tarfs_mount *tmp, const char *name, size_t namelen, panic("%s: type %d not allowed", __func__, type); } if (parent != NULL) { - MPASS(parent->type == VDIR); TARFS_NODE_LOCK(parent); TAILQ_INSERT_TAIL(&parent->dir.dirhead, tnp, dirents); parent->size += sizeof(struct tarfs_node); diff --git a/sys/fs/tarfs/tarfs_vfsops.c b/sys/fs/tarfs/tarfs_vfsops.c index 138a57c22e7f..b3c30e884a9d 100644 --- a/sys/fs/tarfs/tarfs_vfsops.c +++ b/sys/fs/tarfs/tarfs_vfsops.c @@ -320,6 +320,12 @@ tarfs_lookup_path(struct tarfs_mount *tmp, char *name, size_t namelen, break; } + /* we're not at the end, so parent must be a directory */ + if (parent->type != VDIR) { + error = ENOTDIR; + break; + } + /* locate the next separator */ for (sep = name, len = 0; *sep != '\0' && *sep != '/' && len < namelen; @@ -685,8 +691,12 @@ again: error = tarfs_lookup_path(tmp, name, namelen, &namep, &sep, &parent, &tnp, true); - if (error != 0) + if (error != 0) { + TARFS_DPF(ALLOC, "%s: failed to look up %.*s\n", __func__, + (int)namelen, name); + error = EINVAL; goto bad; + } if (tnp != NULL) { if (hdrp->typeflag[0] == TAR_TYPE_DIRECTORY) { /* XXX set attributes? */ diff --git a/tests/sys/fs/tarfs/tarfs_test.sh b/tests/sys/fs/tarfs/tarfs_test.sh index d812ced80bbb..634b6be3dd08 100644 --- a/tests/sys/fs/tarfs/tarfs_test.sh +++ b/tests/sys/fs/tarfs/tarfs_test.sh @@ -33,10 +33,11 @@ mnt="$(realpath ${TMPDIR:-/tmp})/mnt.$$" sum=4da2143234486307bb44eaa610375301781a577d1172f362b88bb4b1643dee62 atf_test_case tarfs_test -tarfs_test_head() { +tarfs_basic_head() { + atf_set "descr" "Basic function test" atf_set "require.user" "root" } -tarfs_test_body() { +tarfs_basic_body() { mkdir "${mnt}" "${mktar}" tarfs_test.tar.zst atf_check mount -rt tarfs tarfs_test.tar.zst "${mnt}" @@ -45,10 +46,31 @@ tarfs_test_body() { atf_check_equal "$(stat -f%d,%i "${mnt}"/sparse_file)" "$(stat -L -f%d,%i "${mnt}"/long_link)" atf_check_equal "$(sha256 -q "${mnt}"/sparse_file)" ${sum} } -tarfs_test_cleanup() { +tarfs_basic_cleanup() { + umount "${mnt}" +} + +atf_test_case tarfs_notdir +tarfs_notdir_head() { + atf_set "descr" "Regression test for PR 269519" + atf_set "require.user" "root" +} +tarfs_notdir_body() { + mkdir "${mnt}" + echo "hello" >d + tar cf tarfs_notdir.tar d + rm d + mkdir -p d/s + echo "world" >d/s/f + tar rf tarfs_notdir.tar d/s/f + atf_check -s not-exit:0 -e match:"Invalid" \ + mount -rt tarfs tarfs_notdir.tar "${mnt}" +} +tarfs_notdir_cleanup() { umount "${mnt}" } atf_init_test_cases() { - atf_add_test_case tarfs_test + atf_add_test_case tarfs_basic + atf_add_test_case tarfs_notdir }