From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 876AAC433FE for ; Wed, 30 Mar 2022 10:26:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238729AbiC3K2M (ORCPT ); Wed, 30 Mar 2022 06:28:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242937AbiC3K2K (ORCPT ); Wed, 30 Mar 2022 06:28:10 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E56BD25FD6D for ; Wed, 30 Mar 2022 03:26:25 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 8C85FB81AD2 for ; Wed, 30 Mar 2022 10:26:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5D7FEC340EC; Wed, 30 Mar 2022 10:26:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1648635982; bh=5ys+ig6p16Mp5Mx8GpzUdJE75r9tr+3JbiMvWCNjgbQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KEHlmR+dQupuPIjmt280S7GadLYit93j96MKaq1/BkdLbL7pQixC5pin0V0ASgB9c BYDSlUvmFbCET4CzS7lswXvG8L3CbrhmFI6p0NUQMk26kiCyU1qdZi7Gb+jP14ecu8 hv9ffD6ksIm5LRL3z38Q1DHcJc83ItIh/0KxbyiDQwMzGQ1mQccybro4UyK81mlolE URkn+pQMT/rf0loRcoK1m5jUK49wc0o1miKy/9JoqLmhhiecnicyDfDHqaxmFlgI3u 82n1QK2gmCOvrXGPhHGwREfKsOVhSuaf/0B1LY2Jup6h6Z34Hs+tViDgM1YaAPR/vJ iTJhlwTyGIJfw== From: Christian Brauner To: Amir Goldstein , Miklos Szeredi Cc: Christian Brauner , Christoph Hellwig , linux-unionfs@vger.kernel.org, Aleksa Sarai , Giuseppe Scrivano , Rodrigo Campos Catelin , Seth Forshee , Luca Bocassi , Lennart Poettering , =?UTF-8?q?St=C3=A9phane=20Graber?= Subject: [PATCH v2 17/19] ovl: handle idmappings in layer open helpers Date: Wed, 30 Mar 2022 12:24:05 +0200 Message-Id: <20220330102409.1290850-18-brauner@kernel.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220330102409.1290850-1-brauner@kernel.org> References: <20220330102409.1290850-1-brauner@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2758; h=from:subject; bh=5ys+ig6p16Mp5Mx8GpzUdJE75r9tr+3JbiMvWCNjgbQ=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMSS56B+QVqp8cOjhnxspWltMLT4t1nQv5Nh98apVzUyeS8fk pv4v7ShlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZhIgDXDP4XMEiXGfp5DTSck1A8E6s VMfqRizXuFnTFr1vPk951LYhn+cDJcuhwze+E1Xw3WP5o3z82qd9ooqv6Z5Y+8yP+cixNkeAE= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-unionfs@vger.kernel.org In earlier patches we already passed down the relevant upper or lower path to ovl_open_realfile(). Now let the open helpers actually take the idmapping of the relevant mount into account when checking permissions. This is needed to support idmapped base layers with overlay. Cc: Tested-by: Giuseppe Scrivano Reviewed-by: Amir Goldstein Signed-off-by: Christian Brauner (Microsoft) --- /* v2 */ unchanged --- fs/overlayfs/file.c | 7 +++++-- fs/overlayfs/util.c | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 656c30bf20a6..7dd44f4e2757 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -42,6 +42,7 @@ static struct file *ovl_open_realfile(const struct file *file, { struct inode *realinode = d_inode(realpath->dentry); struct inode *inode = file_inode(file); + struct user_namespace *real_idmap; struct file *realfile; const struct cred *old_cred; int flags = file->f_flags | OVL_OPEN_FLAGS; @@ -51,12 +52,14 @@ static struct file *ovl_open_realfile(const struct file *file, if (flags & O_APPEND) acc_mode |= MAY_APPEND; + old_cred = ovl_override_creds(inode->i_sb); - err = inode_permission(&init_user_ns, realinode, MAY_OPEN | acc_mode); + real_idmap = mnt_user_ns(realpath->mnt); + err = inode_permission(real_idmap, realinode, MAY_OPEN | acc_mode); if (err) { realfile = ERR_PTR(err); } else { - if (!inode_owner_or_capable(&init_user_ns, realinode)) + if (!inode_owner_or_capable(real_idmap, realinode)) flags &= ~O_NOATIME; realfile = open_with_fake_path(&file->f_path, flags, realinode, diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 79fae06ee10a..7dd2e5e6662a 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -523,6 +523,7 @@ bool ovl_is_whiteout(struct dentry *dentry) struct file *ovl_path_open(struct path *path, int flags) { struct inode *inode = d_inode(path->dentry); + struct user_namespace *real_idmap = mnt_user_ns(path->mnt); int err, acc_mode; if (flags & ~(O_ACCMODE | O_LARGEFILE)) @@ -539,12 +540,12 @@ struct file *ovl_path_open(struct path *path, int flags) BUG(); } - err = inode_permission(&init_user_ns, inode, acc_mode | MAY_OPEN); + err = inode_permission(real_idmap, inode, acc_mode | MAY_OPEN); if (err) return ERR_PTR(err); /* O_NOATIME is an optimization, don't fail if not permitted */ - if (inode_owner_or_capable(&init_user_ns, inode)) + if (inode_owner_or_capable(real_idmap, inode)) flags |= O_NOATIME; return dentry_open(path, flags, current_cred()); -- 2.32.0