devcgroup: fix race against rmdir()
PATCH 1/1 devcgroup: fix race against rmdir()
During the use of a dev_cgroup, we should guarantee the corresponding cgroup won't be deleted (i.e. via rmdir). This can be done through css_get(&dev_cgroup->css), but here we can just get and use the dev_cgroup under rcu_read_lock.
And also remove checking NULL dev_cgroup, it won't be NULL since a task always belongs to a cgroup.
Signed-off-by Li Zefan <[email protected]>
--- security/device_cgroup.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
security/device_cgroup.c +9 -9
@@ -508,12 +508,11 @@ int devcgroup_inode_permission(struct inode *inode, int mask)return 0 ;if (!S_ISBLK (inode->i_mode) && !S_ISCHR (inode->i_mode))return 0 ; - dev_cgroup =css_to_devcgroup (task_subsys_state (current, - devices_subsys_id)); -if (!dev_cgroup) -return 0 ;rcu_read_lock (); + + dev_cgroup =task_devcgroup (current); +list_for_each_entry_rcu (wh, &dev_cgroup->whitelist, list) {if (wh->type &DEV_ALL ) goto acc_check;
@@ -533,6 +532,7 @@ acc_check:rcu_read_unlock ();return 0 ; } +rcu_read_unlock ();return -EPERM ;
@@ -543,12 +543,10 @@ int devcgroup_inode_mknod(int mode, dev_t dev)struct dev_cgroup *dev_cgroup;struct dev_whitelist_item *wh; - dev_cgroup =css_to_devcgroup (task_subsys_state (current, - devices_subsys_id)); -if (!dev_cgroup) -return 0 ; -rcu_read_lock (); + + dev_cgroup =task_devcgroup (current); +list_for_each_entry (wh, &dev_cgroup->whitelist, list) {if (wh->type &DEV_ALL ) goto acc_check;
@@ -566,6 +564,8 @@ acc_check:rcu_read_unlock ();return 0 ; } +rcu_read_unlock (); +return -EPERM ; }
Signature · 1 line
1.5.4.rc3
Quoted 9 lines · Li Zefan
During the use of a
dev_cgroup, we should guarantee the corresponding cgroup won't be deleted (i.e. via rmdir). This can be done throughcss_get(&dev_cgroup->css), but here we can just get and use thedev_cgroupunderrcu_read_lock.And also remove checking NULL
dev_cgroup, it won't be NULL since a task always belongs to a cgroup.Signed-off-by Li Zefan <[email protected]>
Looks good. Thanks, Li.
Quoted 59 lines
--- security/device_cgroup.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)security/device_cgroup.c +9
-9@@ -508,12 +508,11 @@ int devcgroup_inode_permission(struct inode *inode, int mask)return 0 ;if (!S_ISBLK (inode->i_mode) && !S_ISCHR (inode->i_mode))return 0 ; - dev_cgroup =css_to_devcgroup (task_subsys_state (current, - devices_subsys_id)); -if (!dev_cgroup) -return 0 ;rcu_read_lock (); + + dev_cgroup =task_devcgroup (current); +list_for_each_entry_rcu (wh, &dev_cgroup->whitelist, list) {if (wh->type &DEV_ALL ) goto acc_check;@@ -533,6 +532,7 @@ acc_check:rcu_read_unlock ();return 0 ; } +rcu_read_unlock ();return -EPERM ;@@ -543,12 +543,10 @@ int devcgroup_inode_mknod(int mode, dev_t dev)struct dev_cgroup *dev_cgroup;struct dev_whitelist_item *wh; - dev_cgroup =css_to_devcgroup (task_subsys_state (current, - devices_subsys_id)); -if (!dev_cgroup) -return 0 ; -rcu_read_lock (); + + dev_cgroup =task_devcgroup (current); +list_for_each_entry (wh, &dev_cgroup->whitelist, list) {if (wh->type &DEV_ALL ) goto acc_check;@@ -566,6 +564,8 @@ acc_check:rcu_read_unlock ();return 0 ; } +rcu_read_unlock (); +return -EPERM ; }Signature · 1 line
1.5.4.rc3