aboutsummaryrefslogtreecommitdiffstats
path: root/security/device_cgroup.c
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2009-06-17 19:26:33 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-18 16:03:47 -0400
commitcd5008196f7e583f4c558531a2bca59f6c674c5b (patch)
treec91a3d15b09545eddebbc09577b2763ef2e34235 /security/device_cgroup.c
parentf9ab5b5b0f5be506640321d710b0acd3dca6154a (diff)
devcgroup: skip superfluous checks when found the DEV_ALL elem
While walking through the whitelist, if the DEV_ALL item is found, no more check is needed. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: Serge Hallyn <serue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'security/device_cgroup.c')
-rw-r--r--security/device_cgroup.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/security/device_cgroup.c b/security/device_cgroup.c
index 5fda7df19723..b8186bac8b7e 100644
--- a/security/device_cgroup.c
+++ b/security/device_cgroup.c
@@ -490,7 +490,7 @@ int devcgroup_inode_permission(struct inode *inode, int mask)
490 490
491 list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) { 491 list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) {
492 if (wh->type & DEV_ALL) 492 if (wh->type & DEV_ALL)
493 goto acc_check; 493 goto found;
494 if ((wh->type & DEV_BLOCK) && !S_ISBLK(inode->i_mode)) 494 if ((wh->type & DEV_BLOCK) && !S_ISBLK(inode->i_mode))
495 continue; 495 continue;
496 if ((wh->type & DEV_CHAR) && !S_ISCHR(inode->i_mode)) 496 if ((wh->type & DEV_CHAR) && !S_ISCHR(inode->i_mode))
@@ -499,11 +499,12 @@ int devcgroup_inode_permission(struct inode *inode, int mask)
499 continue; 499 continue;
500 if (wh->minor != ~0 && wh->minor != iminor(inode)) 500 if (wh->minor != ~0 && wh->minor != iminor(inode))
501 continue; 501 continue;
502acc_check: 502
503 if ((mask & MAY_WRITE) && !(wh->access & ACC_WRITE)) 503 if ((mask & MAY_WRITE) && !(wh->access & ACC_WRITE))
504 continue; 504 continue;
505 if ((mask & MAY_READ) && !(wh->access & ACC_READ)) 505 if ((mask & MAY_READ) && !(wh->access & ACC_READ))
506 continue; 506 continue;
507found:
507 rcu_read_unlock(); 508 rcu_read_unlock();
508 return 0; 509 return 0;
509 } 510 }
@@ -527,7 +528,7 @@ int devcgroup_inode_mknod(int mode, dev_t dev)
527 528
528 list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) { 529 list_for_each_entry_rcu(wh, &dev_cgroup->whitelist, list) {
529 if (wh->type & DEV_ALL) 530 if (wh->type & DEV_ALL)
530 goto acc_check; 531 goto found;
531 if ((wh->type & DEV_BLOCK) && !S_ISBLK(mode)) 532 if ((wh->type & DEV_BLOCK) && !S_ISBLK(mode))
532 continue; 533 continue;
533 if ((wh->type & DEV_CHAR) && !S_ISCHR(mode)) 534 if ((wh->type & DEV_CHAR) && !S_ISCHR(mode))
@@ -536,9 +537,10 @@ int devcgroup_inode_mknod(int mode, dev_t dev)
536 continue; 537 continue;
537 if (wh->minor != ~0 && wh->minor != MINOR(dev)) 538 if (wh->minor != ~0 && wh->minor != MINOR(dev))
538 continue; 539 continue;
539acc_check: 540
540 if (!(wh->access & ACC_MKNOD)) 541 if (!(wh->access & ACC_MKNOD))
541 continue; 542 continue;
543found:
542 rcu_read_unlock(); 544 rcu_read_unlock();
543 return 0; 545 return 0;
544 } 546 }