All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: sfrench@us.ibm.com, agruen@linbit.com, dilger.kernel@dilger.ca,
	sandeen@redhat.com, tytso@mit.edu, bfields@fieldses.org,
	jlayton@redhat.com
Cc: aneesh.kumar@linux.vnet.ibm.com, linux-fsdevel@vger.kernel.org,
	linux-nfs@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Andreas Gruenbacher <agruen@suse.de>
Subject: [PATCH -V5 16/24] richacl: Permission check algorithm
Date: Wed, 23 Feb 2011 19:22:03 +0530	[thread overview]
Message-ID: <1298469131-16555-17-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <1298469131-16555-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: Andreas Gruenbacher <agruen@suse.de>

As in the standard POSIX file permission model, each process is the
owner, group, or other file class.  A process is

  - in the owner file class if it owns the file,
  - in the group file class if it is in the file's owning group or it
    matches any of the user or group entries, and
  - in the other file class otherwise.

Each file class is associated with a file mask.

A richacl grants a requested access if the NFSv4 acl in the richacl
grants the requested permissions (according to the NFSv4 permission
check algorithm) and the file mask that applies to the process includes
the requested permissions.

Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 fs/richacl_base.c       |   99 +++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/richacl.h |    2 +
 2 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/fs/richacl_base.c b/fs/richacl_base.c
index b59c75c..a6e3199 100644
--- a/fs/richacl_base.c
+++ b/fs/richacl_base.c
@@ -393,3 +393,102 @@ richacl_chmod(struct richacl *acl, mode_t mode)
 	return clone;
 }
 EXPORT_SYMBOL_GPL(richacl_chmod);
+
+/**
+ * richacl_permission  -  richacl permission check algorithm
+ * @inode:	inode to check
+ * @acl:	rich acl of the inode
+ * @mask:	requested access (ACE4_* bitmask)
+ *
+ * Checks if the current process is granted @mask flags in @acl.
+ */
+int
+richacl_permission(struct inode *inode, const struct richacl *acl,
+		   unsigned int mask)
+{
+	const struct richace *ace;
+	unsigned int requested = mask, denied = 0;
+	int in_owning_group = in_group_p(inode->i_gid);
+	int in_owner_or_group_class = in_owning_group;
+
+	/*
+	 * We don't need to know which class the process is in when the acl is
+	 * not masked.
+	 */
+	if (!(acl->a_flags & ACL4_MASKED))
+		in_owner_or_group_class = 1;
+
+	/*
+	 * A process is
+	 *   - in the owner file class if it owns the file,
+	 *   - in the group file class if it is in the file's owning group or
+	 *     it matches any of the user or group entries, and
+	 *   - in the other file class otherwise.
+	 */
+
+	/*
+	 * Check if the acl grants the requested access and determine which
+	 * file class the process is in.
+	 */
+	richacl_for_each_entry(ace, acl) {
+		unsigned int ace_mask = ace->e_mask;
+
+		if (richace_is_inherit_only(ace))
+			continue;
+		if (richace_is_owner(ace)) {
+			if (current_fsuid() != inode->i_uid)
+				continue;
+			goto is_owner;
+		} else if (richace_is_group(ace)) {
+			if (!in_owning_group)
+				continue;
+		} else if (richace_is_unix_id(ace)) {
+			if (ace->e_flags & ACE4_IDENTIFIER_GROUP) {
+				if (!in_group_p(ace->u.e_id))
+					continue;
+			} else {
+				if (current_fsuid() != ace->u.e_id)
+					continue;
+			}
+		} else
+			goto is_everyone;
+
+is_owner:
+		/* The process is in the owner or group file class. */
+		in_owner_or_group_class = 1;
+
+is_everyone:
+		/* Check which mask flags the ACE allows or denies. */
+		if (richace_is_deny(ace))
+			denied |= ace_mask & mask;
+		mask &= ~ace_mask;
+
+		/*
+		 * Keep going until we know which file class
+		 * the process is in.
+		 */
+		if (!mask && in_owner_or_group_class)
+			break;
+	}
+	denied |= mask;
+
+	if (acl->a_flags & ACL4_MASKED) {
+		unsigned int file_mask;
+
+		/*
+		 * The file class a process is in determines which file mask
+		 * applies.  Check if that file mask also grants the requested
+		 * access.
+		 */
+		if (current_fsuid() == inode->i_uid)
+			file_mask = acl->a_owner_mask;
+		else if (in_owner_or_group_class)
+			file_mask = acl->a_group_mask;
+		else
+			file_mask = acl->a_other_mask;
+		denied |= requested & ~file_mask;
+	}
+
+	return denied ? -EACCES : 0;
+}
+EXPORT_SYMBOL_GPL(richacl_permission);
diff --git a/include/linux/richacl.h b/include/linux/richacl.h
index 3aa165b..c9d2761 100644
--- a/include/linux/richacl.h
+++ b/include/linux/richacl.h
@@ -289,5 +289,7 @@ extern unsigned int richacl_mode_to_mask(mode_t);
 extern unsigned int richacl_want_to_mask(int);
 extern void richacl_compute_max_masks(struct richacl *);
 extern struct richacl *richacl_chmod(struct richacl *, mode_t);
+extern int richacl_permission(struct inode *, const struct richacl *,
+			      unsigned int);
 
 #endif /* __RICHACL_H */
-- 
1.7.1


  parent reply	other threads:[~2011-02-23 13:54 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-23 13:51 [PATCH -V5 00/24] New ACL format for better NFSv4 acl interoperability Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 01/24] vfs: Indicate that the permission functions take all the MAY_* flags Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 02/24] vfs: Pass all mask flags down to iop->check_acl Aneesh Kumar K.V
2011-02-23 13:51   ` Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 03/24] vfs: Add a comment to inode_permission() Aneesh Kumar K.V
2011-02-23 13:51   ` Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 04/24] vfs: Add generic IS_ACL() test for acl support Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 05/24] vfs: Add IS_RICHACL() test for richacl support Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 06/24] vfs: Optimize out IS_RICHACL() if CONFIG_FS_RICHACL is not defined Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 07/24] vfs: Add new file and directory create permission flags Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 08/24] vfs: Add delete child and delete self " Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 09/24] vfs: Make the inode passed to inode_change_ok non-const Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 10/24] vfs: Add permission flags for setting file attributes Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 11/24] vfs: Make acl_permission_check() work for richacls Aneesh Kumar K.V
2011-02-23 13:51 ` [PATCH -V5 12/24] richacl: In-memory representation and helper functions Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 13/24] richacl: Permission mapping functions Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 14/24] richacl: Compute maximum file masks from an acl Aneesh Kumar K.V
2011-02-23 13:52   ` Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 15/24] richacl: Update the file masks in chmod() Aneesh Kumar K.V
2011-02-23 13:52   ` Aneesh Kumar K.V
2011-02-23 13:52 ` Aneesh Kumar K.V [this message]
2011-02-23 13:52 ` [PATCH -V5 17/24] richacl: Create-time inheritance Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 18/24] richacl: Check if an acl is equivalent to a file mode Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 19/24] richacl: Automatic Inheritance Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 20/24] richacl: xattr mapping functions Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 21/24] ext4: Use IS_POSIXACL() to check for POSIX ACL support Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 22/24] vfs: Cache richacl in struct inode Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 23/24] ext4: Implement rich acl for ext4 Aneesh Kumar K.V
2011-02-23 13:52 ` [PATCH -V5 24/24] ext4: Add temporary richacl mount option " Aneesh Kumar K.V
2011-02-28 21:11 ` [PATCH -V5 00/24] New ACL format for better NFSv4 acl interoperability Ted Ts'o
2011-02-28 21:11   ` Ted Ts'o
2011-03-01  6:50   ` Aneesh Kumar K. V
2011-03-02 15:49     ` J. Bruce Fields
2011-03-02 17:47       ` Aneesh Kumar K. V
2011-03-02 17:47         ` Aneesh Kumar K. V
2011-03-02 18:58         ` J. Bruce Fields
2011-03-02 18:58           ` J. Bruce Fields
2011-03-04 10:38           ` Aneesh Kumar K. V
2011-03-05  0:32             ` J. Bruce Fields
2011-03-05 17:58               ` Aneesh Kumar K. V
2011-03-05 17:58                 ` Aneesh Kumar K. V
2011-03-15  8:46                 ` Andreas Gruenbacher
2011-05-11 22:16   ` Björn JACKE
2011-05-11 22:16   ` Björn JACKE
2011-05-11 22:16   ` Björn JACKE
     [not found]     ` <E1QKJAl-00DGc7-EB-dqLtpHMqGvUyWpdLl23E4A@public.gmane.org>
2011-05-13 15:40       ` Aneesh Kumar K.V
2011-05-13 15:40     ` Aneesh Kumar K.V
2011-05-13 15:40     ` Aneesh Kumar K.V
2011-05-13 15:40       ` Aneesh Kumar K.V

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1298469131-16555-17-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
    --to=aneesh.kumar@linux.vnet.ibm.com \
    --cc=agruen@linbit.com \
    --cc=agruen@suse.de \
    --cc=bfields@fieldses.org \
    --cc=dilger.kernel@dilger.ca \
    --cc=jlayton@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=sandeen@redhat.com \
    --cc=sfrench@us.ibm.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.