Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp3431366rdb; Wed, 13 Sep 2023 11:47:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFmXoIsDpSVaAIdAFZWoAxtE8Oc14+HKRQj4Ffye46t8nE5MnbwsMUTqbB6JfiiSWKp5gP9 X-Received: by 2002:a17:90b:1bc7:b0:261:685:95b6 with SMTP id oa7-20020a17090b1bc700b00261068595b6mr3011376pjb.13.1694630867882; Wed, 13 Sep 2023 11:47:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694630867; cv=none; d=google.com; s=arc-20160816; b=g9GM2BwygDOCDlPqLk/GfZG4kHqvEdsPwr7n0xBYXwXpXq4f7QI/2Fo9XKTDO9t4eQ kkKsmtaZ0QhMeyTb25ZFZeDbN3qs7UvGLwBJ8IyOgz5gHqb2Za0usrbzL0D2+8qzEULr 2wYN0W1vaRgjDuFT1RD+1iMg5XLcFsQIb2KwAjnkUxPQ9mdECcrFAsGfL9Xtz1DSZ+wU czL1y481nuneQVESEg/aOmA/AF9hDVMcce1oXYf2Gh/ivgf+fwvjeOHPE/gWzTkE7NZ5 ieNZ9Q5416MY/npOrrcgP+67XmyHNxroFVZYuOheGJjZzKDeqa+BkWCSnw3mQduhzkb5 CKiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=TIhG5T2KIKMdZjw60PIq0vQttf6HwO/EKV4ZJ8HdZ78=; fh=DOKTvQurDsCsXoge0h7sxISPCanebavGJTPbFOvAskc=; b=Z5tSYpVXZrfr4up5JWsPFSMmlsGVE8F410zEYoFd4dkXL1ZNY+J+4yRCKaJwUa3nBE 3xYvILNdTvU9nyb4BY7+JdwBAXHOfrPYPumJF8cKxM0CcZ7tdmJSxFcdO4VEQxARjwRG 4bx08Y5hfCElyPgwNs9zfL+Wem0MYlYzvXITKbG3JiysSII6MV1FLyTuJXehkIGL0gaG AA5MxZdC0e33WCZe1LPfgFYzykV7mNA4JM0IfTZA2U1hUgyQat0zq4wQYouPFNUF3mOL rtA7XlL0zrxIUHoy2POU29z0zh+adn3Nwl4fO49whg4j8tt3QF/Naih80h6ru5vr4IRa wLnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=KLu2GdUc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id q12-20020a17090aa00c00b0026b53effbb7si2004962pjp.173.2023.09.13.11.47.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 11:47:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=KLu2GdUc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id A3175811907A; Wed, 13 Sep 2023 08:24:18 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241482AbjIMPYA (ORCPT + 99 others); Wed, 13 Sep 2023 11:24:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241462AbjIMPXn (ORCPT ); Wed, 13 Sep 2023 11:23:43 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6A0551BE2 for ; Wed, 13 Sep 2023 08:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1694618569; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TIhG5T2KIKMdZjw60PIq0vQttf6HwO/EKV4ZJ8HdZ78=; b=KLu2GdUcy0blz8trPMsr+pl6e5J0Wr6k8BlBgb1Vxf9W9xnUX6GPrxQLEOTL+KFkve9/Rn 0hCZ6bVhMRvNohZxqTsrhDzWumFjr4mYH/SH1XX9e1lamks/2pm5m4RrTrZ72OBsXhXG5a 8aQG7Kupw/hdb5C/u0QDPDdeNMbTvVA= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-537-V65f7zmKMmSaH4zK0Q4Q3w-1; Wed, 13 Sep 2023 11:22:48 -0400 X-MC-Unique: V65f7zmKMmSaH4zK0Q4Q3w-1 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-9ad8a967a30so142852066b.0 for ; Wed, 13 Sep 2023 08:22:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694618567; x=1695223367; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TIhG5T2KIKMdZjw60PIq0vQttf6HwO/EKV4ZJ8HdZ78=; b=XqsnKRSeytbCjPaIeAUHDRcPENPZjzrWrM0hUggX3EfiGbudRkzoJIYnLy0ShS3Tfp r4VlNQca+OO61KqB0tX17H/rbXONuGLFHzlzkFF/tUwXGqMII468U+BaHaHr4PI2CB+G FoyUzVTq+AU1Jb99mBtlOAV+UAkMCaF3qGO/oSno0jTQAfysE8fOqp0cLiJUFc6PaXA7 cmZii4jo2w+0RuaSlsd6ohX87NSHywmXA5T9JMgvtsBJBe2OkDoo+qOCdu/4ZamROrwX 7J8zOnOjXCah+N4Do8hh5kTpUPk5vdD/0QNI2DL8/Kekk5BGJwXPQ6BTPUTCZYdgsysy 9k8w== X-Gm-Message-State: AOJu0YzOW8JX3EMec3SKBJs0IJyXTEP+B7COFPSPA9VFBc2/zwrLrMbY E9DeJbfgR9cWxekzQyBDKjbZSbvyyEHCkKTEaPtptG995rtUS3ihZ5nAiXTzqWX69IQiWTYj0dL 2IzXcaSZBkVb/FfAMjSPvd/AN X-Received: by 2002:a17:906:20dd:b0:9a6:5696:388e with SMTP id c29-20020a17090620dd00b009a65696388emr2105313ejc.77.1694618567061; Wed, 13 Sep 2023 08:22:47 -0700 (PDT) X-Received: by 2002:a17:906:20dd:b0:9a6:5696:388e with SMTP id c29-20020a17090620dd00b009a65696388emr2105305ejc.77.1694618566882; Wed, 13 Sep 2023 08:22:46 -0700 (PDT) Received: from maszat.piliscsaba.szeredi.hu (79-120-253-96.pool.digikabel.hu. [79.120.253.96]) by smtp.gmail.com with ESMTPSA id q18-20020a170906a09200b0099b8234a9fesm8640663ejy.1.2023.09.13.08.22.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 08:22:45 -0700 (PDT) From: Miklos Szeredi To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-man@vger.kernel.org, linux-security-module@vger.kernel.org, Karel Zak , Ian Kent , David Howells , Linus Torvalds , Al Viro , Christian Brauner , Amir Goldstein Subject: [RFC PATCH 3/3] add listmnt(2) syscall Date: Wed, 13 Sep 2023 17:22:36 +0200 Message-ID: <20230913152238.905247-4-mszeredi@redhat.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230913152238.905247-1-mszeredi@redhat.com> References: <20230913152238.905247-1-mszeredi@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Wed, 13 Sep 2023 08:24:18 -0700 (PDT) X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Add way to query the children of a particular mount. This is a more flexible way to iterate the mount tree than having to parse the complete /proc/self/mountinfo. Lookup the mount by the old (32bit) or new (64bit) mount ID. If a mount needs to be queried based on path, then statx(2) can be used to first query the mount ID belonging to the path. Return an array of new (64bit) mount ID's. Without privileges only mounts are listed which are reachable from the task's root. Signed-off-by: Miklos Szeredi --- arch/x86/entry/syscalls/syscall_64.tbl | 1 + fs/namespace.c | 51 ++++++++++++++++++++++++++ include/linux/syscalls.h | 2 + include/uapi/asm-generic/unistd.h | 5 ++- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl index 6d807c30cd16..0d9a47b0ce9b 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -376,6 +376,7 @@ 452 common fchmodat2 sys_fchmodat2 453 64 map_shadow_stack sys_map_shadow_stack 454 common statmnt sys_statmnt +455 common listmnt sys_listmnt # # Due to a historical design error, certain syscalls are numbered differently diff --git a/fs/namespace.c b/fs/namespace.c index 088a52043bba..5362b1ffb26f 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -4988,6 +4988,57 @@ SYSCALL_DEFINE5(statmnt, u64, mnt_id, return err; } +static long do_listmnt(struct vfsmount *mnt, u64 __user *buf, size_t bufsize, + const struct path *root) +{ + struct mount *r, *m = real_mount(mnt); + struct path rootmnt = { .mnt = root->mnt, .dentry = root->mnt->mnt_root }; + long ctr = 0; + + if (!capable(CAP_SYS_ADMIN) && + !is_path_reachable(m, mnt->mnt_root, &rootmnt)) + return -EPERM; + + list_for_each_entry(r, &m->mnt_mounts, mnt_child) { + if (!capable(CAP_SYS_ADMIN) && + !is_path_reachable(r, r->mnt.mnt_root, root)) + continue; + + if (ctr >= bufsize) + return -EOVERFLOW; + if (put_user(r->mnt_id_unique, buf + ctr)) + return -EFAULT; + ctr++; + if (ctr < 0) + return -ERANGE; + } + return ctr; +} + +SYSCALL_DEFINE4(listmnt, u64, mnt_id, u64 __user *, buf, size_t, bufsize, + unsigned int, flags) +{ + struct vfsmount *mnt; + struct path root; + long err; + + if (flags) + return -EINVAL; + + down_read(&namespace_sem); + mnt = lookup_mnt_in_ns(mnt_id, current->nsproxy->mnt_ns); + err = -ENOENT; + if (mnt) { + get_fs_root(current->fs, &root); + err = do_listmnt(mnt, buf, bufsize, &root); + path_put(&root); + } + up_read(&namespace_sem); + + return err; +} + + static void __init init_mount_tree(void) { struct vfsmount *mnt; diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 1099bd307fa7..5d776cdb6f18 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -411,6 +411,8 @@ asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, asmlinkage long sys_statmnt(u64 mnt_id, u64 mask, struct statmnt __user *buf, size_t bufsize, unsigned int flags); +asmlinkage long sys_listmnt(u64 mnt_id, u64 __user *buf, size_t bufsize, + unsigned int flags); asmlinkage long sys_truncate(const char __user *path, long length); asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); #if BITS_PER_LONG == 32 diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 640997231ff6..a2b41370f603 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -826,8 +826,11 @@ __SYSCALL(__NR_fchmodat2, sys_fchmodat2) #define __NR_statmnt 454 __SYSCALL(__NR_statmnt, sys_statmnt) +#define __NR_listmnt 455 +__SYSCALL(__NR_listmnt, sys_listmnt) + #undef __NR_syscalls -#define __NR_syscalls 455 +#define __NR_syscalls 456 /* * 32 bit systems traditionally used different -- 2.41.0