* [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-21 15:38 [PATCH 0/4] selinux: add object class discovery Christopher J. PeBenito
@ 2007-05-21 15:38 ` Christopher J. PeBenito
2007-05-21 17:02 ` James Morris
0 siblings, 1 reply; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-21 15:38 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux, Christopher J. PeBenito
From: Christopher J. PeBenito <cpebenito@tresys.com>
Add support to the SELinux security server for obtaining a list of classes,
and for obtaining a list of permissions for a specified class.
Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
---
security/selinux/include/security.h | 3 +
security/selinux/ss/services.c | 93 +++++++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+), 0 deletions(-)
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
index b94378a..731a173 100644
--- a/security/selinux/include/security.h
+++ b/security/selinux/include/security.h
@@ -87,6 +87,9 @@ int security_validate_transition(u32 oldsid, u32 newsid, u32 tasksid,
int security_sid_mls_copy(u32 sid, u32 mls_sid, u32 *new_sid);
+int security_get_classes(char ***classes, int *nclasses);
+int security_get_permissions(char *class, char ***perms, int *nperms);
+
#define SECURITY_FS_USE_XATTR 1 /* use xattr */
#define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
#define SECURITY_FS_USE_TASK 3 /* use task SIDs, e.g. pipefs/sockfs */
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 40660ff..4196c66 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1996,6 +1996,99 @@ out:
return rc;
}
+static int get_classes_callback(void *k, void *d, void *args)
+{
+ struct class_datum *datum = d;
+ char *name = k, **classes = args;
+ int value = datum->value - 1;
+
+ classes[value] = kstrdup(name,GFP_KERNEL);
+
+ if (classes[value] == NULL)
+ return -ENOMEM;
+
+ return 0;
+}
+
+int security_get_classes(char ***classes, int *nclasses)
+{
+ int rc = -ENOMEM;
+
+ POLICY_RDLOCK;
+
+ *nclasses = policydb.p_classes.nprim;
+ *classes = kzalloc(*nclasses*sizeof(*classes),GFP_KERNEL);
+ if (!*classes)
+ goto out;
+
+ rc = hashtab_map(policydb.p_classes.table,get_classes_callback,*classes);
+ if (rc < 0) {
+ int i;
+ for (i = 0; i < *nclasses; i++)
+ kfree((*classes)[i]);
+ kfree(*classes);
+ }
+
+out:
+ POLICY_RDUNLOCK;
+ return rc;
+}
+
+static int get_permissions_callback(void *k, void *d, void *args)
+{
+ struct perm_datum *datum = d;
+ char *name = k, **perms = args;
+ int value = datum->value - 1;
+
+ perms[value] = kstrdup(name,GFP_KERNEL);
+
+ if (perms[value] == NULL)
+ return -ENOMEM;
+
+ return 0;
+}
+
+int security_get_permissions(char *class, char ***perms, int *nperms)
+{
+ int rc = -ENOMEM, i;
+ struct class_datum *match;
+
+ POLICY_RDLOCK;
+
+ match = hashtab_search(policydb.p_classes.table,class);
+ if (match == NULL) {
+ printk(KERN_ERR "%s: unrecognized class %s\n",__FUNCTION__,class);
+ rc = -EINVAL;
+ goto out;
+ }
+
+ *nperms = match->permissions.nprim;
+ *perms = kzalloc(*nperms*sizeof(*perms),GFP_KERNEL);
+ if (!*perms)
+ goto out;
+
+ if (match->comdatum) {
+ rc = hashtab_map(match->comdatum->permissions.table,get_permissions_callback,*perms);
+ if (rc < 0)
+ goto err;
+ }
+
+ rc = hashtab_map(match->permissions.table,get_permissions_callback,*perms);
+ if (rc < 0)
+ goto err;
+
+out:
+ POLICY_RDUNLOCK;
+ return rc;
+
+err:
+ POLICY_RDUNLOCK;
+ for (i = 0; i < *nperms; i++)
+ kfree((*perms)[i]);
+ kfree(*perms);
+ return rc;
+}
+
struct selinux_audit_rule {
u32 au_seqno;
struct context au_ctxt;
--
1.5.1.4
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-21 15:38 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
@ 2007-05-21 17:02 ` James Morris
2007-05-21 18:44 ` Christopher J. PeBenito
0 siblings, 1 reply; 12+ messages in thread
From: James Morris @ 2007-05-21 17:02 UTC (permalink / raw)
To: Christopher J. PeBenito; +Cc: sds, jmorris, eparis, selinux
On Mon, 21 May 2007, Christopher J. PeBenito wrote:
> int security_sid_mls_copy(u32 sid, u32 mls_sid, u32 *new_sid);
>
> +int security_get_classes(char ***classes, int *nclasses);
> +int security_get_permissions(char *class, char ***perms, int *nperms);
> +
> #define SECURITY_FS_USE_XATTR 1 /* use xattr */
> #define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
> #define SECURITY_FS_USE_TASK 3 /* use task SIDs, e.g. pipefs/sockfs */
> diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
> index 40660ff..4196c66 100644
> --- a/security/selinux/ss/services.c
> +++ b/security/selinux/ss/services.c
> @@ -1996,6 +1996,99 @@ out:
> return rc;
> }
>
> +static int get_classes_callback(void *k, void *d, void *args)
> +{
> + struct class_datum *datum = d;
> + char *name = k, **classes = args;
> + int value = datum->value - 1;
> +
> + classes[value] = kstrdup(name,GFP_KERNEL);
Coding style: spaces after commas (needs to be fixed throughout).
> +
Probably don't need this blank line.
> + if (classes[value] == NULL)
> + return -ENOMEM;
I'd suggest
if (!foo)
to remain consistent.
> +
> + return 0;
> +}
> +
> +int security_get_classes(char ***classes, int *nclasses)
> +{
> + int rc = -ENOMEM;
> +
> + POLICY_RDLOCK;
> +
> + *nclasses = policydb.p_classes.nprim;
> + *classes = kzalloc(*nclasses*sizeof(*classes),GFP_KERNEL);
Use kcalloc().
Needs to be GFP_ATOMIC because you're holding a spinlock.
> + if (!*classes)
> + goto out;
> +
> + rc = hashtab_map(policydb.p_classes.table,get_classes_callback,*classes);
> + if (rc < 0) {
> + int i;
> + for (i = 0; i < *nclasses; i++)
> + kfree((*classes)[i]);
> + kfree(*classes);
> + }
> +
> +out:
> + POLICY_RDUNLOCK;
> + return rc;
> +}
> +
> +static int get_permissions_callback(void *k, void *d, void *args)
> +{
> + struct perm_datum *datum = d;
> + char *name = k, **perms = args;
> + int value = datum->value - 1;
> +
> + perms[value] = kstrdup(name,GFP_KERNEL);
Ditto.
(Have you tested this with all of the lock debugging enabled ?)
> +
> + if (perms[value] == NULL)
> + return -ENOMEM;
> +
> + return 0;
> +}
> +
> +int security_get_permissions(char *class, char ***perms, int *nperms)
> +{
> + int rc = -ENOMEM, i;
> + struct class_datum *match;
> +
> + POLICY_RDLOCK;
> +
> + match = hashtab_search(policydb.p_classes.table,class);
> + if (match == NULL) {
> + printk(KERN_ERR "%s: unrecognized class %s\n",__FUNCTION__,class);
> + rc = -EINVAL;
> + goto out;
> + }
> +
> + *nperms = match->permissions.nprim;
> + *perms = kzalloc(*nperms*sizeof(*perms),GFP_KERNEL);
Ditto.
> + if (!*perms)
> + goto out;
> +
> + if (match->comdatum) {
> + rc = hashtab_map(match->comdatum->permissions.table,get_permissions_callback,*perms);
> + if (rc < 0)
> + goto err;
> + }
> +
> + rc = hashtab_map(match->permissions.table,get_permissions_callback,*perms);
> + if (rc < 0)
> + goto err;
> +
> +out:
> + POLICY_RDUNLOCK;
> + return rc;
> +
> +err:
> + POLICY_RDUNLOCK;
> + for (i = 0; i < *nperms; i++)
> + kfree((*perms)[i]);
> + kfree(*perms);
> + return rc;
> +}
> +
> struct selinux_audit_rule {
> u32 au_seqno;
> struct context au_ctxt;
>
--
James Morris
<jmorris@namei.org>
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-21 17:02 ` James Morris
@ 2007-05-21 18:44 ` Christopher J. PeBenito
0 siblings, 0 replies; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-21 18:44 UTC (permalink / raw)
To: James Morris; +Cc: sds, jmorris, eparis, selinux
On Mon, 2007-05-21 at 13:02 -0400, James Morris wrote:
> On Mon, 21 May 2007, Christopher J. PeBenito wrote:
> > +int security_get_classes(char ***classes, int *nclasses)
> > +{
> > + int rc = -ENOMEM;
> > +
> > + POLICY_RDLOCK;
> > +
> > + *nclasses = policydb.p_classes.nprim;
> > + *classes = kzalloc(*nclasses*sizeof(*classes),GFP_KERNEL);
>
> Use kcalloc().
>
> Needs to be GFP_ATOMIC because you're holding a spinlock.
[...]
> (Have you tested this with all of the lock debugging enabled ?)
Nope, my mistake. I'm a kernel coding newbie :)
--
Chris PeBenito
Tresys Technology, LLC
(410) 290-1411 x150
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
* selinux: add object class discovery v2
@ 2007-05-23 13:12 Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
2007-05-23 13:24 ` selinux: add object class discovery v2 James Morris
0 siblings, 2 replies; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 13:12 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux
Add support to SELinux for userland to discover object classes and their
permissions. This patch set adds a class directory to the root of selinuxfs
and a tree of object classes and permissions, with the value for each of the
respective component.
--
Chris PeBenito
Tresys Technology, LLC
(410) 290-1411 x150
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-23 13:12 selinux: add object class discovery v2 Christopher J. PeBenito
@ 2007-05-23 13:12 ` Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 2/4] selinux: rename sel_remove_bools() for more general usage Christopher J. PeBenito
2007-05-23 15:42 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy James Antill
2007-05-23 13:24 ` selinux: add object class discovery v2 James Morris
1 sibling, 2 replies; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 13:12 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux, Christopher J. PeBenito
From: Christopher J. PeBenito <cpebenito@tresys.com>
Add support to the SELinux security server for obtaining a list of classes,
and for obtaining a list of permissions for a specified class.
Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
---
security/selinux/include/security.h | 3 +
security/selinux/ss/services.c | 95 +++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+), 0 deletions(-)
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
index b94378a..731a173 100644
--- a/security/selinux/include/security.h
+++ b/security/selinux/include/security.h
@@ -87,6 +87,9 @@ int security_validate_transition(u32 oldsid, u32 newsid, u32 tasksid,
int security_sid_mls_copy(u32 sid, u32 mls_sid, u32 *new_sid);
+int security_get_classes(char ***classes, int *nclasses);
+int security_get_permissions(char *class, char ***perms, int *nperms);
+
#define SECURITY_FS_USE_XATTR 1 /* use xattr */
#define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
#define SECURITY_FS_USE_TASK 3 /* use task SIDs, e.g. pipefs/sockfs */
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 40660ff..a1909bf 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1996,6 +1996,101 @@ out:
return rc;
}
+static int get_classes_callback(void *k, void *d, void *args)
+{
+ struct class_datum *datum = d;
+ char *name = k, **classes = args;
+ int value = datum->value - 1;
+
+ classes[value] = kstrdup(name, GFP_ATOMIC);
+ if (!classes[value])
+ return -ENOMEM;
+
+ return 0;
+}
+
+int security_get_classes(char ***classes, int *nclasses)
+{
+ int rc = -ENOMEM;
+
+ POLICY_RDLOCK;
+
+ *nclasses = policydb.p_classes.nprim;
+ *classes = kcalloc(*nclasses, sizeof(*classes), GFP_ATOMIC);
+ if (!*classes)
+ goto out;
+
+ rc = hashtab_map(policydb.p_classes.table, get_classes_callback,
+ *classes);
+ if (rc < 0) {
+ int i;
+ for (i = 0; i < *nclasses; i++)
+ kfree((*classes)[i]);
+ kfree(*classes);
+ }
+
+out:
+ POLICY_RDUNLOCK;
+ return rc;
+}
+
+static int get_permissions_callback(void *k, void *d, void *args)
+{
+ struct perm_datum *datum = d;
+ char *name = k, **perms = args;
+ int value = datum->value - 1;
+
+ perms[value] = kstrdup(name, GFP_ATOMIC);
+ if (!perms[value])
+ return -ENOMEM;
+
+ return 0;
+}
+
+int security_get_permissions(char *class, char ***perms, int *nperms)
+{
+ int rc = -ENOMEM, i;
+ struct class_datum *match;
+
+ POLICY_RDLOCK;
+
+ match = hashtab_search(policydb.p_classes.table, class);
+ if (!match) {
+ printk(KERN_ERR "%s: unrecognized class %s\n",
+ __FUNCTION__, class);
+ rc = -EINVAL;
+ goto out;
+ }
+
+ *nperms = match->permissions.nprim;
+ *perms = kcalloc(*nperms, sizeof(*perms), GFP_ATOMIC);
+ if (!*perms)
+ goto out;
+
+ if (match->comdatum) {
+ rc = hashtab_map(match->comdatum->permissions.table,
+ get_permissions_callback, *perms);
+ if (rc < 0)
+ goto err;
+ }
+
+ rc = hashtab_map(match->permissions.table, get_permissions_callback,
+ *perms);
+ if (rc < 0)
+ goto err;
+
+out:
+ POLICY_RDUNLOCK;
+ return rc;
+
+err:
+ POLICY_RDUNLOCK;
+ for (i = 0; i < *nperms; i++)
+ kfree((*perms)[i]);
+ kfree(*perms);
+ return rc;
+}
+
struct selinux_audit_rule {
u32 au_seqno;
struct context au_ctxt;
--
1.5.1.6
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/4] selinux: rename sel_remove_bools() for more general usage.
2007-05-23 13:12 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
@ 2007-05-23 13:12 ` Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 3/4] selinux: change sel_make_dir() to specify inode counter Christopher J. PeBenito
2007-05-23 15:42 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy James Antill
1 sibling, 1 reply; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 13:12 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux, Christopher J. PeBenito
From: Christopher J. PeBenito <cpebenito@tresys.com>
sel_remove_bools() will also be used by the object class discovery, rename
it for more general use.
Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
---
security/selinux/selinuxfs.c | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 98af83f..9c7b6ef 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -940,9 +940,8 @@ static const struct file_operations sel_commit_bools_ops = {
.write = sel_commit_bools_write,
};
-/* delete booleans - partial revoke() from
- * fs/proc/generic.c proc_kill_inodes */
-static void sel_remove_bools(struct dentry *de)
+/* partial revoke() from fs/proc/generic.c proc_kill_inodes */
+static void sel_remove_entries(struct dentry *de)
{
struct list_head *p, *node;
struct super_block *sb = de->d_sb;
@@ -998,7 +997,7 @@ static int sel_make_bools(void)
kfree(bool_pending_values);
bool_pending_values = NULL;
- sel_remove_bools(dir);
+ sel_remove_entries(dir);
if (!(page = (char*)get_zeroed_page(GFP_KERNEL)))
return -ENOMEM;
@@ -1048,7 +1047,7 @@ out:
return ret;
err:
kfree(values);
- sel_remove_bools(dir);
+ sel_remove_entries(dir);
ret = -ENOMEM;
goto out;
}
--
1.5.1.6
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/4] selinux: change sel_make_dir() to specify inode counter.
2007-05-23 13:12 ` [PATCH 2/4] selinux: rename sel_remove_bools() for more general usage Christopher J. PeBenito
@ 2007-05-23 13:12 ` Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 4/4] selinux: add selinuxfs structure for object class discovery Christopher J. PeBenito
0 siblings, 1 reply; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 13:12 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux, Christopher J. PeBenito
From: Christopher J. PeBenito <cpebenito@tresys.com>
Specify the inode counter explicitly in sel_make_dir(), rather than always
using sel_last_ino.
Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
---
security/selinux/selinuxfs.c | 11 ++++++-----
1 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 9c7b6ef..95051b1 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -1293,7 +1293,8 @@ out:
return ret;
}
-static int sel_make_dir(struct inode *dir, struct dentry *dentry)
+static int sel_make_dir(struct inode *dir, struct dentry *dentry,
+ unsigned long *ino)
{
int ret = 0;
struct inode *inode;
@@ -1305,7 +1306,7 @@ static int sel_make_dir(struct inode *dir, struct dentry *dentry)
}
inode->i_op = &simple_dir_inode_operations;
inode->i_fop = &simple_dir_operations;
- inode->i_ino = ++sel_last_ino;
+ inode->i_ino = ++(*ino);
/* directory inodes start off with i_nlink == 2 (for "." entry) */
inc_nlink(inode);
d_add(dentry, inode);
@@ -1351,7 +1352,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
goto err;
}
- ret = sel_make_dir(root_inode, dentry);
+ ret = sel_make_dir(root_inode, dentry, &sel_last_ino);
if (ret)
goto err;
@@ -1384,7 +1385,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
goto err;
}
- ret = sel_make_dir(root_inode, dentry);
+ ret = sel_make_dir(root_inode, dentry, &sel_last_ino);
if (ret)
goto err;
@@ -1398,7 +1399,7 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
goto err;
}
- ret = sel_make_dir(root_inode, dentry);
+ ret = sel_make_dir(root_inode, dentry, &sel_last_ino);
if (ret)
goto err;
--
1.5.1.6
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/4] selinux: add selinuxfs structure for object class discovery
2007-05-23 13:12 ` [PATCH 3/4] selinux: change sel_make_dir() to specify inode counter Christopher J. PeBenito
@ 2007-05-23 13:12 ` Christopher J. PeBenito
2007-05-30 15:06 ` Stephen Smalley
0 siblings, 1 reply; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 13:12 UTC (permalink / raw)
To: sds, jmorris, eparis; +Cc: selinux, Christopher J. PeBenito
From: Christopher J. PeBenito <cpebenito@tresys.com>
The structure is as follows (relative to selinuxfs root):
/class/file/index
/class/file/perms/read
/class/file/perms/write
...
Each class is allocated 33 inodes, 1 for the class index and 32 for
permissions. Relative to SEL_CLASS_INO_OFFSET, the inode of the index file
DIV 33 is the class number. The inode of the permission file % 33 is the
index of the permission for that class.
Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
---
security/selinux/include/security.h | 1 +
security/selinux/selinuxfs.c | 249 +++++++++++++++++++++++++++++++++++
2 files changed, 250 insertions(+), 0 deletions(-)
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
index 731a173..83bdd4d 100644
--- a/security/selinux/include/security.h
+++ b/security/selinux/include/security.h
@@ -41,6 +41,7 @@ extern int selinux_mls_enabled;
int security_load_policy(void * data, size_t len);
+#define SEL_VEC_MAX 32
struct av_decision {
u32 allowed;
u32 decided;
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 95051b1..8be9706 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -67,6 +67,10 @@ static struct dentry *bool_dir = NULL;
static int bool_num = 0;
static int *bool_pending_values = NULL;
+/* global data for classes */
+static struct dentry *class_dir = NULL;
+static unsigned long last_class_ino;
+
extern void selnl_notify_setenforce(int val);
/* Check whether a task is allowed to use a security operation. */
@@ -106,6 +110,7 @@ static unsigned long sel_last_ino = SEL_INO_NEXT - 1;
#define SEL_INITCON_INO_OFFSET 0x01000000
#define SEL_BOOL_INO_OFFSET 0x02000000
+#define SEL_CLASS_INO_OFFSET 0x04000000
#define SEL_INO_MASK 0x00ffffff
#define TMPBUFLEN 12
@@ -237,6 +242,11 @@ static const struct file_operations sel_policyvers_ops = {
/* declaration for sel_write_load */
static int sel_make_bools(void);
+static int sel_make_classes(void);
+
+/* declaration for sel_make_class_dirs */
+static int sel_make_dir(struct inode *dir, struct dentry *dentry,
+ unsigned long *ino);
static ssize_t sel_read_mls(struct file *filp, char __user *buf,
size_t count, loff_t *ppos)
@@ -287,10 +297,18 @@ static ssize_t sel_write_load(struct file * file, const char __user * buf,
goto out;
ret = sel_make_bools();
+ if (ret) {
+ length = ret;
+ goto out1;
+ }
+
+ ret = sel_make_classes();
if (ret)
length = ret;
else
length = count;
+
+out1:
audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_POLICY_LOAD,
"policy loaded auid=%u",
audit_get_loginuid(current->audit_context));
@@ -1293,6 +1311,225 @@ out:
return ret;
}
+static inline unsigned int sel_div(unsigned long a, unsigned long b)
+{
+ return a / b - (a % b < 0);
+}
+
+static inline unsigned long sel_class_to_ino(u16 class)
+{
+ return (class * (SEL_VEC_MAX + 1)) | SEL_CLASS_INO_OFFSET;
+}
+
+static inline u16 sel_ino_to_class(unsigned long ino)
+{
+ return sel_div(ino & SEL_INO_MASK, SEL_VEC_MAX + 1);
+}
+
+static inline unsigned long sel_perm_to_ino(u16 class, u32 perm)
+{
+ return (class * (SEL_VEC_MAX + 1) + perm) | SEL_CLASS_INO_OFFSET;
+}
+
+static inline u32 sel_ino_to_perm(unsigned long ino)
+{
+ return (ino & SEL_INO_MASK) % (SEL_VEC_MAX + 1);
+}
+
+static ssize_t sel_read_class(struct file * file, char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ ssize_t rc, len;
+ char *page;
+ unsigned long ino = file->f_path.dentry->d_inode->i_ino;
+
+ page = (char *)__get_free_page(GFP_KERNEL);
+ if (!page) {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ len = snprintf(page, PAGE_SIZE, "%d", sel_ino_to_class(ino));
+ rc = simple_read_from_buffer(buf, count, ppos, page, len);
+ free_page((unsigned long)page);
+out:
+ return rc;
+}
+
+static const struct file_operations sel_class_ops = {
+ .read = sel_read_class,
+};
+
+static ssize_t sel_read_perm(struct file * file, char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ ssize_t rc, len;
+ char *page;
+ unsigned long ino = file->f_path.dentry->d_inode->i_ino;
+
+ page = (char *)__get_free_page(GFP_KERNEL);
+ if (!page) {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ len = snprintf(page, PAGE_SIZE,"%d", sel_ino_to_perm(ino));
+ rc = simple_read_from_buffer(buf, count, ppos, page, len);
+ free_page((unsigned long)page);
+out:
+ return rc;
+}
+
+static const struct file_operations sel_perm_ops = {
+ .read = sel_read_perm,
+};
+
+static int sel_make_perm_files(char *objclass, int classvalue,
+ struct dentry *dir)
+{
+ int i, rc = 0, nperms;
+ char **perms;
+
+ rc = security_get_permissions(objclass, &perms, &nperms);
+ if (rc)
+ goto out;
+
+ for (i = 0; i < nperms; i++) {
+ struct inode *inode;
+ struct dentry *dentry;
+
+ dentry = d_alloc_name(dir, perms[i]);
+ if (!dentry) {
+ rc = -ENOMEM;
+ goto out1;
+ }
+
+ inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO);
+ if (!inode) {
+ rc = -ENOMEM;
+ goto out1;
+ }
+ inode->i_fop = &sel_perm_ops;
+ /* i+1 since perm values are 1-indexed */
+ inode->i_ino = sel_perm_to_ino(classvalue, i+1);
+ d_add(dentry, inode);
+ }
+
+out1:
+ for (i = 0; i < nperms; i++)
+ kfree(perms[i]);
+ kfree(perms);
+out:
+ return rc;
+}
+
+static int sel_make_class_dir_entries(char *classname, int index,
+ struct dentry *dir)
+{
+ struct dentry *dentry = NULL;
+ struct inode *inode = NULL;
+ int rc;
+
+ dentry = d_alloc_name(dir, "index");
+ if (!dentry) {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO);
+ if (!inode) {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ inode->i_fop = &sel_class_ops;
+ inode->i_ino = sel_class_to_ino(index);
+ d_add(dentry, inode);
+
+ dentry = d_alloc_name(dir, "perms");
+ if (!dentry) {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ rc = sel_make_dir(dir->d_inode, dentry, &last_class_ino);
+ if (rc)
+ goto out;
+
+ rc = sel_make_perm_files(classname, index, dentry);
+
+out:
+ return rc;
+}
+
+static void sel_remove_classes(void)
+{
+ struct list_head *class_node;
+
+ list_for_each(class_node, &class_dir->d_subdirs) {
+ struct dentry *class_subdir = list_entry(class_node,
+ struct dentry, d_u.d_child);
+ struct list_head *class_subdir_node;
+
+ list_for_each(class_subdir_node, &class_subdir->d_subdirs) {
+ struct dentry *d = list_entry(class_subdir_node,
+ struct dentry, d_u.d_child);
+
+ if (d->d_inode)
+ if (d->d_inode->i_mode & S_IFDIR)
+ sel_remove_entries(d);
+ }
+
+ sel_remove_entries(class_subdir);
+ }
+
+ sel_remove_entries(class_dir);
+}
+
+static int sel_make_classes(void)
+{
+ int rc = 0, nclasses, i;
+ char **classes;
+
+ /* delete any existing entries */
+ sel_remove_classes();
+
+ rc = security_get_classes(&classes, &nclasses);
+ if (rc < 0)
+ goto out;
+
+ /* +2 since classes are 1-indexed */
+ last_class_ino = sel_class_to_ino(nclasses+2);
+
+ for (i = 0; i < nclasses; i++) {
+ struct dentry *class_name_dir;
+
+ class_name_dir = d_alloc_name(class_dir, classes[i]);
+ if (!class_name_dir) {
+ rc = -ENOMEM;
+ goto out1;
+ }
+
+ rc = sel_make_dir(class_dir->d_inode, class_name_dir,
+ &last_class_ino);
+ if (rc)
+ goto out1;
+
+ /* i+1 since class values are 1-indexed */
+ rc = sel_make_class_dir_entries(classes[i], i+1,
+ class_name_dir);
+ if (rc)
+ goto out1;
+ }
+
+out1:
+ for (i = 0; i < nclasses; i++)
+ kfree(classes[i]);
+ kfree(classes);
+out:
+ return rc;
+}
+
static int sel_make_dir(struct inode *dir, struct dentry *dentry,
unsigned long *ino)
{
@@ -1407,6 +1644,18 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
if (ret)
goto err;
+ dentry = d_alloc_name(sb->s_root, "class");
+ if (!dentry) {
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ ret = sel_make_dir(root_inode, dentry, &sel_last_ino);
+ if (ret)
+ goto err;
+
+ class_dir = dentry;
+
out:
return ret;
err:
--
1.5.1.6
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: selinux: add object class discovery v2
2007-05-23 13:12 selinux: add object class discovery v2 Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
@ 2007-05-23 13:24 ` James Morris
1 sibling, 0 replies; 12+ messages in thread
From: James Morris @ 2007-05-23 13:24 UTC (permalink / raw)
To: Christopher J. PeBenito; +Cc: sds, jmorris, eparis, selinux
On Wed, 23 May 2007, Christopher J. PeBenito wrote:
> Add support to SELinux for userland to discover object classes and their
> permissions. This patch set adds a class directory to the root of selinuxfs
> and a tree of object classes and permissions, with the value for each of the
> respective component.
Looks good. I'll do some testing & wait for an ack from Stephen.
--
James Morris
<jmorris@namei.org>
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-23 13:12 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 2/4] selinux: rename sel_remove_bools() for more general usage Christopher J. PeBenito
@ 2007-05-23 15:42 ` James Antill
2007-05-23 17:25 ` Christopher J. PeBenito
1 sibling, 1 reply; 12+ messages in thread
From: James Antill @ 2007-05-23 15:42 UTC (permalink / raw)
To: Christopher J. PeBenito; +Cc: sds, jmorris, eparis, selinux
[-- Attachment #1: Type: text/plain, Size: 1432 bytes --]
On Wed, 2007-05-23 at 09:12 -0400, Christopher J. PeBenito wrote:
>
> +static int get_permissions_callback(void *k, void *d, void *args)
> +{
> + struct perm_datum *datum = d;
> + char *name = k, **perms = args;
> + int value = datum->value - 1;
> +
> + perms[value] = kstrdup(name, GFP_ATOMIC);
> + if (!perms[value])
> + return -ENOMEM;
> +
> + return 0;
> +}
> +
> +int security_get_permissions(char *class, char ***perms, int *nperms)
> +{
[...]
> + *nperms = match->permissions.nprim;
> + *perms = kcalloc(*nperms, sizeof(*perms), GFP_ATOMIC);
> + if (!*perms)
> + goto out;
> +
> + if (match->comdatum) {
> + rc = hashtab_map(match->comdatum->permissions.table,
> + get_permissions_callback, *perms);
> + if (rc < 0)
> + goto err;
> + }
> +
> + rc = hashtab_map(match->permissions.table, get_permissions_callback,
> + *perms);
So I'm probably just wasting your time out of ignorance here, but this
looks really suspicious to me. Why don't you need to add in
match->comdatum->permissions.nprim for the allocation? Also how is it
guaranteed that one "datum->value - 1" won't be the same in both
hashtabs? (if it isn't you've leaked memory).
--
James Antill <jantill@redhat.com>
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy
2007-05-23 15:42 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy James Antill
@ 2007-05-23 17:25 ` Christopher J. PeBenito
0 siblings, 0 replies; 12+ messages in thread
From: Christopher J. PeBenito @ 2007-05-23 17:25 UTC (permalink / raw)
To: James Antill; +Cc: sds, jmorris, eparis, selinux
On Wed, 2007-05-23 at 11:42 -0400, James Antill wrote:
> On Wed, 2007-05-23 at 09:12 -0400, Christopher J. PeBenito wrote:
> >
> > +static int get_permissions_callback(void *k, void *d, void *args)
> > +{
> > + struct perm_datum *datum = d;
> > + char *name = k, **perms = args;
> > + int value = datum->value - 1;
> > +
> > + perms[value] = kstrdup(name, GFP_ATOMIC);
> > + if (!perms[value])
> > + return -ENOMEM;
> > +
> > + return 0;
> > +}
> > +
> > +int security_get_permissions(char *class, char ***perms, int *nperms)
> > +{
> [...]
> > + *nperms = match->permissions.nprim;
> > + *perms = kcalloc(*nperms, sizeof(*perms), GFP_ATOMIC);
> > + if (!*perms)
> > + goto out;
> > +
> > + if (match->comdatum) {
> > + rc = hashtab_map(match->comdatum->permissions.table,
> > + get_permissions_callback, *perms);
> > + if (rc < 0)
> > + goto err;
> > + }
> > +
> > + rc = hashtab_map(match->permissions.table, get_permissions_callback,
> > + *perms);
>
>
> So I'm probably just wasting your time out of ignorance here, but this
> looks really suspicious to me. Why don't you need to add in
> match->comdatum->permissions.nprim for the allocation?
match->permissions.nprim already includes
match->comdatum->permissions.nprim, see:
http://marc.info/?l=selinux&m=117517987105068&w=2
> Also how is it
> guaranteed that one "datum->value - 1" won't be the same in both
> hashtabs? (if it isn't you've leaked memory).
If I understand what you're saying, then we would have a common
permission and a unique permission with the same value, which isn't
possible.
--
Chris PeBenito
Tresys Technology, LLC
(410) 290-1411 x150
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 4/4] selinux: add selinuxfs structure for object class discovery
2007-05-23 13:12 ` [PATCH 4/4] selinux: add selinuxfs structure for object class discovery Christopher J. PeBenito
@ 2007-05-30 15:06 ` Stephen Smalley
0 siblings, 0 replies; 12+ messages in thread
From: Stephen Smalley @ 2007-05-30 15:06 UTC (permalink / raw)
To: Christopher J. PeBenito; +Cc: jmorris, eparis, selinux
On Wed, 2007-05-23 at 09:12 -0400, Christopher J. PeBenito wrote:
> From: Christopher J. PeBenito <cpebenito@tresys.com>
>
> The structure is as follows (relative to selinuxfs root):
>
> /class/file/index
> /class/file/perms/read
> /class/file/perms/write
> ...
>
> Each class is allocated 33 inodes, 1 for the class index and 32 for
> permissions. Relative to SEL_CLASS_INO_OFFSET, the inode of the index file
> DIV 33 is the class number. The inode of the permission file % 33 is the
> index of the permission for that class.
>
> Signed-off-by: Christopher J. PeBenito <cpebenito@tresys.com>
For all four patches:
Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
>
> ---
> security/selinux/include/security.h | 1 +
> security/selinux/selinuxfs.c | 249 +++++++++++++++++++++++++++++++++++
> 2 files changed, 250 insertions(+), 0 deletions(-)
>
> diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
> index 731a173..83bdd4d 100644
> --- a/security/selinux/include/security.h
> +++ b/security/selinux/include/security.h
> @@ -41,6 +41,7 @@ extern int selinux_mls_enabled;
>
> int security_load_policy(void * data, size_t len);
>
> +#define SEL_VEC_MAX 32
> struct av_decision {
> u32 allowed;
> u32 decided;
> diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
> index 95051b1..8be9706 100644
> --- a/security/selinux/selinuxfs.c
> +++ b/security/selinux/selinuxfs.c
> @@ -67,6 +67,10 @@ static struct dentry *bool_dir = NULL;
> static int bool_num = 0;
> static int *bool_pending_values = NULL;
>
> +/* global data for classes */
> +static struct dentry *class_dir = NULL;
> +static unsigned long last_class_ino;
> +
> extern void selnl_notify_setenforce(int val);
>
> /* Check whether a task is allowed to use a security operation. */
> @@ -106,6 +110,7 @@ static unsigned long sel_last_ino = SEL_INO_NEXT - 1;
>
> #define SEL_INITCON_INO_OFFSET 0x01000000
> #define SEL_BOOL_INO_OFFSET 0x02000000
> +#define SEL_CLASS_INO_OFFSET 0x04000000
> #define SEL_INO_MASK 0x00ffffff
>
> #define TMPBUFLEN 12
> @@ -237,6 +242,11 @@ static const struct file_operations sel_policyvers_ops = {
>
> /* declaration for sel_write_load */
> static int sel_make_bools(void);
> +static int sel_make_classes(void);
> +
> +/* declaration for sel_make_class_dirs */
> +static int sel_make_dir(struct inode *dir, struct dentry *dentry,
> + unsigned long *ino);
>
> static ssize_t sel_read_mls(struct file *filp, char __user *buf,
> size_t count, loff_t *ppos)
> @@ -287,10 +297,18 @@ static ssize_t sel_write_load(struct file * file, const char __user * buf,
> goto out;
>
> ret = sel_make_bools();
> + if (ret) {
> + length = ret;
> + goto out1;
> + }
> +
> + ret = sel_make_classes();
> if (ret)
> length = ret;
> else
> length = count;
> +
> +out1:
> audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_POLICY_LOAD,
> "policy loaded auid=%u",
> audit_get_loginuid(current->audit_context));
> @@ -1293,6 +1311,225 @@ out:
> return ret;
> }
>
> +static inline unsigned int sel_div(unsigned long a, unsigned long b)
> +{
> + return a / b - (a % b < 0);
> +}
> +
> +static inline unsigned long sel_class_to_ino(u16 class)
> +{
> + return (class * (SEL_VEC_MAX + 1)) | SEL_CLASS_INO_OFFSET;
> +}
> +
> +static inline u16 sel_ino_to_class(unsigned long ino)
> +{
> + return sel_div(ino & SEL_INO_MASK, SEL_VEC_MAX + 1);
> +}
> +
> +static inline unsigned long sel_perm_to_ino(u16 class, u32 perm)
> +{
> + return (class * (SEL_VEC_MAX + 1) + perm) | SEL_CLASS_INO_OFFSET;
> +}
> +
> +static inline u32 sel_ino_to_perm(unsigned long ino)
> +{
> + return (ino & SEL_INO_MASK) % (SEL_VEC_MAX + 1);
> +}
> +
> +static ssize_t sel_read_class(struct file * file, char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + ssize_t rc, len;
> + char *page;
> + unsigned long ino = file->f_path.dentry->d_inode->i_ino;
> +
> + page = (char *)__get_free_page(GFP_KERNEL);
> + if (!page) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + len = snprintf(page, PAGE_SIZE, "%d", sel_ino_to_class(ino));
> + rc = simple_read_from_buffer(buf, count, ppos, page, len);
> + free_page((unsigned long)page);
> +out:
> + return rc;
> +}
> +
> +static const struct file_operations sel_class_ops = {
> + .read = sel_read_class,
> +};
> +
> +static ssize_t sel_read_perm(struct file * file, char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + ssize_t rc, len;
> + char *page;
> + unsigned long ino = file->f_path.dentry->d_inode->i_ino;
> +
> + page = (char *)__get_free_page(GFP_KERNEL);
> + if (!page) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + len = snprintf(page, PAGE_SIZE,"%d", sel_ino_to_perm(ino));
> + rc = simple_read_from_buffer(buf, count, ppos, page, len);
> + free_page((unsigned long)page);
> +out:
> + return rc;
> +}
> +
> +static const struct file_operations sel_perm_ops = {
> + .read = sel_read_perm,
> +};
> +
> +static int sel_make_perm_files(char *objclass, int classvalue,
> + struct dentry *dir)
> +{
> + int i, rc = 0, nperms;
> + char **perms;
> +
> + rc = security_get_permissions(objclass, &perms, &nperms);
> + if (rc)
> + goto out;
> +
> + for (i = 0; i < nperms; i++) {
> + struct inode *inode;
> + struct dentry *dentry;
> +
> + dentry = d_alloc_name(dir, perms[i]);
> + if (!dentry) {
> + rc = -ENOMEM;
> + goto out1;
> + }
> +
> + inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO);
> + if (!inode) {
> + rc = -ENOMEM;
> + goto out1;
> + }
> + inode->i_fop = &sel_perm_ops;
> + /* i+1 since perm values are 1-indexed */
> + inode->i_ino = sel_perm_to_ino(classvalue, i+1);
> + d_add(dentry, inode);
> + }
> +
> +out1:
> + for (i = 0; i < nperms; i++)
> + kfree(perms[i]);
> + kfree(perms);
> +out:
> + return rc;
> +}
> +
> +static int sel_make_class_dir_entries(char *classname, int index,
> + struct dentry *dir)
> +{
> + struct dentry *dentry = NULL;
> + struct inode *inode = NULL;
> + int rc;
> +
> + dentry = d_alloc_name(dir, "index");
> + if (!dentry) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + inode = sel_make_inode(dir->d_sb, S_IFREG|S_IRUGO);
> + if (!inode) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + inode->i_fop = &sel_class_ops;
> + inode->i_ino = sel_class_to_ino(index);
> + d_add(dentry, inode);
> +
> + dentry = d_alloc_name(dir, "perms");
> + if (!dentry) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + rc = sel_make_dir(dir->d_inode, dentry, &last_class_ino);
> + if (rc)
> + goto out;
> +
> + rc = sel_make_perm_files(classname, index, dentry);
> +
> +out:
> + return rc;
> +}
> +
> +static void sel_remove_classes(void)
> +{
> + struct list_head *class_node;
> +
> + list_for_each(class_node, &class_dir->d_subdirs) {
> + struct dentry *class_subdir = list_entry(class_node,
> + struct dentry, d_u.d_child);
> + struct list_head *class_subdir_node;
> +
> + list_for_each(class_subdir_node, &class_subdir->d_subdirs) {
> + struct dentry *d = list_entry(class_subdir_node,
> + struct dentry, d_u.d_child);
> +
> + if (d->d_inode)
> + if (d->d_inode->i_mode & S_IFDIR)
> + sel_remove_entries(d);
> + }
> +
> + sel_remove_entries(class_subdir);
> + }
> +
> + sel_remove_entries(class_dir);
> +}
> +
> +static int sel_make_classes(void)
> +{
> + int rc = 0, nclasses, i;
> + char **classes;
> +
> + /* delete any existing entries */
> + sel_remove_classes();
> +
> + rc = security_get_classes(&classes, &nclasses);
> + if (rc < 0)
> + goto out;
> +
> + /* +2 since classes are 1-indexed */
> + last_class_ino = sel_class_to_ino(nclasses+2);
> +
> + for (i = 0; i < nclasses; i++) {
> + struct dentry *class_name_dir;
> +
> + class_name_dir = d_alloc_name(class_dir, classes[i]);
> + if (!class_name_dir) {
> + rc = -ENOMEM;
> + goto out1;
> + }
> +
> + rc = sel_make_dir(class_dir->d_inode, class_name_dir,
> + &last_class_ino);
> + if (rc)
> + goto out1;
> +
> + /* i+1 since class values are 1-indexed */
> + rc = sel_make_class_dir_entries(classes[i], i+1,
> + class_name_dir);
> + if (rc)
> + goto out1;
> + }
> +
> +out1:
> + for (i = 0; i < nclasses; i++)
> + kfree(classes[i]);
> + kfree(classes);
> +out:
> + return rc;
> +}
> +
> static int sel_make_dir(struct inode *dir, struct dentry *dentry,
> unsigned long *ino)
> {
> @@ -1407,6 +1644,18 @@ static int sel_fill_super(struct super_block * sb, void * data, int silent)
> if (ret)
> goto err;
>
> + dentry = d_alloc_name(sb->s_root, "class");
> + if (!dentry) {
> + ret = -ENOMEM;
> + goto err;
> + }
> +
> + ret = sel_make_dir(root_inode, dentry, &sel_last_ino);
> + if (ret)
> + goto err;
> +
> + class_dir = dentry;
> +
> out:
> return ret;
> err:
--
Stephen Smalley
National Security Agency
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2007-05-30 15:06 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-23 13:12 selinux: add object class discovery v2 Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 2/4] selinux: rename sel_remove_bools() for more general usage Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 3/4] selinux: change sel_make_dir() to specify inode counter Christopher J. PeBenito
2007-05-23 13:12 ` [PATCH 4/4] selinux: add selinuxfs structure for object class discovery Christopher J. PeBenito
2007-05-30 15:06 ` Stephen Smalley
2007-05-23 15:42 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy James Antill
2007-05-23 17:25 ` Christopher J. PeBenito
2007-05-23 13:24 ` selinux: add object class discovery v2 James Morris
-- strict thread matches above, loose matches on Subject: below --
2007-05-21 15:38 [PATCH 0/4] selinux: add object class discovery Christopher J. PeBenito
2007-05-21 15:38 ` [PATCH 1/4] selinux: add support for querying object classes and permissions from the running policy Christopher J. PeBenito
2007-05-21 17:02 ` James Morris
2007-05-21 18:44 ` Christopher J. PeBenito
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.