cgroups.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Rebase device_cgroup v2 patchset
@ 2012-10-19 21:16 Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 1/3] device_cgroup: rename deny_all to behavior Aristeu Rozanski
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Aristeu Rozanski @ 2012-10-19 21:16 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: Dave Jones, Andrew Morton, Tejun Heo, Li Zefan, James Morris,
	Pavel Emelyanov, Serge Hallyn, Jiri Slaby,
	cgroups-u79uwXL29TY76Z2rM5mHXA

This patchset rebases the v2 of the patchset since the v1 was pushed into -rc1
instead. The last patch, not present on previous patchset, fixes the
permission check when allowing everything in a cgroup.

 device_cgroup.c |   87 +++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 61 insertions(+), 26 deletions(-)

Cc: Dave Jones <davej-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Cc: James Morris <jmorris-gx6/JNMH7DfYtjvyW6yDsg@public.gmane.org>
Cc: Pavel Emelyanov <xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
Cc: Serge Hallyn <serge.hallyn-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Signed-off-by: Aristeu Rozanski <aris-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

-- 
Aristeu

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] device_cgroup: rename deny_all to behavior
  2012-10-19 21:16 [PATCH 0/3] Rebase device_cgroup v2 patchset Aristeu Rozanski
@ 2012-10-19 21:16 ` Aristeu Rozanski
       [not found]   ` <20121019211626.583893413-cd6kKtb6gxi3M6m420IelR/sF2h8X+2i0E9HWUfgJXw@public.gmane.org>
  2012-10-19 21:16 ` [PATCH 2/3] device_cgroup: stop using simple_strtoul() Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 3/3] device_cgroup: add proper checking when changing default behavior Aristeu Rozanski
  2 siblings, 1 reply; 6+ messages in thread
From: Aristeu Rozanski @ 2012-10-19 21:16 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: Dave Jones, Andrew Morton, Tejun Heo, Li Zefan, James Morris,
	Pavel Emelyanov, Serge Hallyn, Jiri Slaby,
	cgroups-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: deny_all.patch --]
[-- Type: text/plain, Size: 3883 bytes --]

This was done in a v2 patch but v1 ended up being committed. The variable name
is less confusing and stores the default behavior when no matching exception
exists.


Cc: Dave Jones <davej-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Cc: James Morris <jmorris-gx6/JNMH7DfYtjvyW6yDsg@public.gmane.org>
Cc: Pavel Emelyanov <xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
Cc: Serge Hallyn <serge.hallyn-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
Signed-off-by: Jiri Slaby <jslaby-AlSwsSmVLrQ@public.gmane.org>

---
 security/device_cgroup.c |   25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

--- github.orig/security/device_cgroup.c	2012-10-19 16:35:37.936804289 -0400
+++ github/security/device_cgroup.c	2012-10-19 16:35:46.366102913 -0400
@@ -42,7 +42,10 @@ struct dev_exception_item {
 struct dev_cgroup {
 	struct cgroup_subsys_state css;
 	struct list_head exceptions;
-	bool deny_all;
+	enum {
+		DEVCG_DEFAULT_ALLOW,
+		DEVCG_DEFAULT_DENY,
+	} behavior;
 };
 
 static inline struct dev_cgroup *css_to_devcgroup(struct cgroup_subsys_state *s)
@@ -182,13 +185,13 @@ static struct cgroup_subsys_state *devcg
 	parent_cgroup = cgroup->parent;
 
 	if (parent_cgroup == NULL)
-		dev_cgroup->deny_all = false;
+		dev_cgroup->behavior = DEVCG_DEFAULT_ALLOW;
 	else {
 		parent_dev_cgroup = cgroup_to_devcgroup(parent_cgroup);
 		mutex_lock(&devcgroup_mutex);
 		ret = dev_exceptions_copy(&dev_cgroup->exceptions,
 					  &parent_dev_cgroup->exceptions);
-		dev_cgroup->deny_all = parent_dev_cgroup->deny_all;
+		dev_cgroup->behavior = parent_dev_cgroup->behavior;
 		mutex_unlock(&devcgroup_mutex);
 		if (ret) {
 			kfree(dev_cgroup);
@@ -260,7 +263,7 @@ static int devcgroup_seq_read(struct cgr
 	 * - List the exceptions in case the default policy is to deny
 	 * This way, the file remains as a "whitelist of devices"
 	 */
-	if (devcgroup->deny_all == false) {
+	if (devcgroup->behavior == DEVCG_DEFAULT_ALLOW) {
 		set_access(acc, ACC_MASK);
 		set_majmin(maj, ~0);
 		set_majmin(min, ~0);
@@ -314,12 +317,12 @@ 		if (ex->minor != ~0 && ex->minor != re
 	 * In two cases we'll consider this new exception valid:
 	 * - the dev cgroup has its default policy to allow + exception list:
 	 *   the new exception should *not* match any of the exceptions
-	 *   (!deny_all, !match)
+	 *   (behavior == DEVCG_DEFAULT_ALLOW, !match)
 	 * - the dev cgroup has its default policy to deny + exception list:
 	 *   the new exception *should* match the exceptions
-	 *   (deny_all, match)
+	 *   (behavior == DEVCG_DEFAULT_DENY, match)
 	 */
-	if (dev_cgroup->deny_all == match)
+	if ((dev_cgroup->behavior == DEVCG_DEFAULT_DENY) == match)
 		return 1;
 	return 0;
 }
@@ -375,11 +378,11 @@ 	memset(&ex, 0, sizeof(ex));
 			if (!parent_has_perm(devcgroup, &ex))
 				return -EPERM;
 			dev_exception_clean(devcgroup);
-			devcgroup->deny_all = false;
+			devcgroup->behavior = DEVCG_DEFAULT_ALLOW;
 			break;
 		case DEVCG_DENY:
 			dev_exception_clean(devcgroup);
-			devcgroup->deny_all = true;
+			devcgroup->behavior = DEVCG_DEFAULT_DENY;
 			break;
 		default:
 			return -EINVAL;
@@ -452,7 +455,7 @@ 		case '\0':
 		 * an matching exception instead. And be silent about it: we
 		 * don't want to break compatibility
 		 */
-		if (devcgroup->deny_all == false) {
+		if (devcgroup->behavior == DEVCG_DEFAULT_ALLOW) {
 			dev_exception_rm(devcgroup, &ex);
 			return 0;
 		}
@@ -463,7 +466,7 @@ 			return 0;
 		 * an matching exception instead. And be silent about it: we
 		 * don't want to break compatibility
 		 */
-		if (devcgroup->deny_all == true) {
+		if (devcgroup->behavior == DEVCG_DEFAULT_DENY) {
 			dev_exception_rm(devcgroup, &ex);
 			return 0;
 		}

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/3] device_cgroup: stop using simple_strtoul()
  2012-10-19 21:16 [PATCH 0/3] Rebase device_cgroup v2 patchset Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 1/3] device_cgroup: rename deny_all to behavior Aristeu Rozanski
@ 2012-10-19 21:16 ` Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 3/3] device_cgroup: add proper checking when changing default behavior Aristeu Rozanski
  2 siblings, 0 replies; 6+ messages in thread
From: Aristeu Rozanski @ 2012-10-19 21:16 UTC (permalink / raw)
  To: linux-kernel
  Cc: Dave Jones, Andrew Morton, Tejun Heo, Li Zefan, James Morris,
	Pavel Emelyanov, Serge Hallyn, Jiri Slaby, cgroups

[-- Attachment #1: kstrtou32.patch --]
[-- Type: text/plain, Size: 1890 bytes --]

This patch converts the code to use kstrtou32() instead of simple_strtoul()
which is deprecated. The real size of the variables are u32, so use kstrtou32
instead of kstrtoul


Cc: Dave Jones <davej@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Li Zefan <lizefan@huawei.com>
Cc: James Morris <jmorris@namei.org>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>

---
 security/device_cgroup.c |   28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

--- github.orig/security/device_cgroup.c	2012-10-19 16:35:46.366102913 -0400
+++ github/security/device_cgroup.c	2012-10-19 16:35:50.801229331 -0400
@@ -361,8 +361,8 @@ static int devcgroup_update_access(struc
 				   int filetype, const char *buffer)
 {
 	const char *b;
-	char *endp;
-	int count;
+	char temp[12];		/* 11 + 1 characters needed for a u32 */
+	int count, rc;
 	struct dev_exception_item ex;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -405,8 +405,16 @@ 		return 0;
 		ex.major = ~0;
 		b++;
 	} else if (isdigit(*b)) {
-		ex.major = simple_strtoul(b, &endp, 10);
-		b = endp;
+		memset(temp, 0, sizeof(temp));
+		for (count = 0; count < sizeof(temp) - 1; count++) {
+			temp[count] = *b;
+			b++;
+			if (!isdigit(*b))
+				break;
+		}
+		rc = kstrtou32(temp, 10, &ex.major);
+		if (rc)
+			return -EINVAL;
 	} else {
 		return -EINVAL;
 	}
@@ -419,8 +427,16 @@ 		ex.major = simple_strtoul(b, &endp, 10
 		ex.minor = ~0;
 		b++;
 	} else if (isdigit(*b)) {
-		ex.minor = simple_strtoul(b, &endp, 10);
-		b = endp;
+		memset(temp, 0, sizeof(temp));
+		for (count = 0; count < sizeof(temp) - 1; count++) {
+			temp[count] = *b;
+			b++;
+			if (!isdigit(*b))
+				break;
+		}
+		rc = kstrtou32(temp, 10, &ex.minor);
+		if (rc)
+			return -EINVAL;
 	} else {
 		return -EINVAL;
 	}

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/3] device_cgroup: add proper checking when changing default behavior
  2012-10-19 21:16 [PATCH 0/3] Rebase device_cgroup v2 patchset Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 1/3] device_cgroup: rename deny_all to behavior Aristeu Rozanski
  2012-10-19 21:16 ` [PATCH 2/3] device_cgroup: stop using simple_strtoul() Aristeu Rozanski
@ 2012-10-19 21:16 ` Aristeu Rozanski
  2 siblings, 0 replies; 6+ messages in thread
From: Aristeu Rozanski @ 2012-10-19 21:16 UTC (permalink / raw)
  To: linux-kernel
  Cc: Dave Jones, Andrew Morton, Tejun Heo, Li Zefan, James Morris,
	Pavel Emelyanov, Serge Hallyn, Jiri Slaby, cgroups

[-- Attachment #1: fix-perm.patch --]
[-- Type: text/plain, Size: 1912 bytes --]

Before changing a group's default behavior to ALLOW, we must check if its
parent's behavior is also ALLOW.

Cc: Tejun Heo <tj@kernel.org>
Cc: Li Zefan <lizefan@huawei.com>
Cc: James Morris <jmorris@namei.org>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Aristeu Rozanski <aris@redhat.com>

---
 security/device_cgroup.c |   19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

--- github.orig/security/device_cgroup.c	2012-10-19 16:36:50.135790476 -0400
+++ github/security/device_cgroup.c	2012-10-19 16:48:50.710978125 -0400
@@ -344,6 +344,17 @@ static int parent_has_perm(struct dev_cg
 	return may_access(parent, ex);
 }
 
+/**
+ * may_allow_all - checks if it's possible to change the behavior to
+ *		   allow based on parent's rules.
+ * @parent: device cgroup's parent
+ * returns: != 0 in case it's allowed, 0 otherwise
+ */
+static inline int may_allow_all(struct dev_cgroup *parent)
+{
+	return parent->behavior == DEVCG_DEFAULT_ALLOW;
+}
+
 /*
  * Modify the exception list using allow/deny rules.
  * CAP_SYS_ADMIN is needed for this.  It's at least separate from CAP_MKNOD
@@ -364,6 +375,8 @@ static int devcgroup_update_access(struc
 	char temp[12];		/* 11 + 1 characters needed for a u32 */
 	int count, rc;
 	struct dev_exception_item ex;
+	struct cgroup *p = devcgroup->css.cgroup;
+	struct dev_cgroup *parent = cgroup_to_devcgroup(p->parent);
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
@@ -375,9 +388,13 @@ 	memset(&ex, 0, sizeof(ex));
 	case 'a':
 		switch (filetype) {
 		case DEVCG_ALLOW:
-			if (!parent_has_perm(devcgroup, &ex))
+			if (!may_allow_all(parent))
 				return -EPERM;
 			dev_exception_clean(devcgroup);
+			rc = dev_exceptions_copy(&devcgroup->exceptions,
+						 &parent->exceptions);
+			if (rc)
+				return rc;
 			devcgroup->behavior = DEVCG_DEFAULT_ALLOW;
 			break;
 		case DEVCG_DENY:

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] device_cgroup: rename deny_all to behavior
       [not found]   ` <20121019211626.583893413-cd6kKtb6gxi3M6m420IelR/sF2h8X+2i0E9HWUfgJXw@public.gmane.org>
@ 2012-10-19 21:45     ` Jiri Slaby
  2012-10-22 13:35       ` Aristeu Rozanski
  0 siblings, 1 reply; 6+ messages in thread
From: Jiri Slaby @ 2012-10-19 21:45 UTC (permalink / raw)
  To: Aristeu Rozanski
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Dave Jones, Andrew Morton,
	Tejun Heo, Li Zefan, James Morris, Pavel Emelyanov, Serge Hallyn,
	cgroups-u79uwXL29TY76Z2rM5mHXA

> Signed-off-by: Jiri Slaby <jslaby-AlSwsSmVLrQ@public.gmane.org>

R U sure?        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
As I don't remember myself ever seeing this patch...
Maybe I should start smoking some crap to refresh my memory?

-- 
js
suse labs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] device_cgroup: rename deny_all to behavior
  2012-10-19 21:45     ` Jiri Slaby
@ 2012-10-22 13:35       ` Aristeu Rozanski
  0 siblings, 0 replies; 6+ messages in thread
From: Aristeu Rozanski @ 2012-10-22 13:35 UTC (permalink / raw)
  To: Jiri Slaby
  Cc: linux-kernel, Dave Jones, Andrew Morton, Tejun Heo, Li Zefan,
	James Morris, Pavel Emelyanov, Serge Hallyn, cgroups

On Fri, Oct 19, 2012 at 11:45:06PM +0200, Jiri Slaby wrote:
> > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
> 
> R U sure?        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> As I don't remember myself ever seeing this patch...
> Maybe I should start smoking some crap to refresh my memory?

argh, sorry. wanted to include everyone and ended up copying/pasting it.
will resubmit

-- 
Aristeu

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-10-22 13:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-19 21:16 [PATCH 0/3] Rebase device_cgroup v2 patchset Aristeu Rozanski
2012-10-19 21:16 ` [PATCH 1/3] device_cgroup: rename deny_all to behavior Aristeu Rozanski
     [not found]   ` <20121019211626.583893413-cd6kKtb6gxi3M6m420IelR/sF2h8X+2i0E9HWUfgJXw@public.gmane.org>
2012-10-19 21:45     ` Jiri Slaby
2012-10-22 13:35       ` Aristeu Rozanski
2012-10-19 21:16 ` [PATCH 2/3] device_cgroup: stop using simple_strtoul() Aristeu Rozanski
2012-10-19 21:16 ` [PATCH 3/3] device_cgroup: add proper checking when changing default behavior Aristeu Rozanski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).