devscgroup: make white list more compact in some cases
PATCH 2/2 devscgroup: make white list more compact in some cases
Consider you added a 'c foo:bar r' permission to some cgroup and then (a bit later) 'c'foo:bar w' for it. After this you'll see a c foo:bar r
c foo:bar w
lines in a devices.list file.
Another example - consider you added 10 'c foo:bar r' permissions to some cgroup (e.g. by mistake). After this you'll see 10
c foo:bar r
lines in a list file.
This is weird. This situation also has one more annoying consequence. Having many items in a white list makes permissions checking slower, sine it has to walk a longer list.
The proposal is to merge permissions for items, that correspond to the same device.
--- security/device_cgroup.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-)
security/device_cgroup.c +16 -2
@@ -106,7 +106,7 @@ free_and_exit:static int dev_whitelist_add (struct dev_cgroup *dev_cgroup,struct dev_whitelist_item *wh) { -struct dev_whitelist_item *whcopy; +struct dev_whitelist_item *whcopy, *walk; whcopy =kmalloc (sizeof (*whcopy),GFP_KERNEL );if (!whcopy)
@@ -114,7 +114,21 @@ static int dev_whitelist_add(struct dev_cgroup *dev_cgroup,memcpy (whcopy, wh,sizeof (*whcopy));spin_lock (&dev_cgroup->lock); -list_add_tail (&whcopy->list, &dev_cgroup->whitelist); +list_for_each_entry (walk, &dev_cgroup->whitelist, list) { +if (walk->type != wh->type) +continue ; +if (walk->major != wh->major) +continue ; +if (walk->minor != wh->minor) +continue ; + + walk->access |= wh->access; +kfree (whcopy); + whcopy =NULL ; + } + +if (whcopy !=NULL ) +list_add_tail (&whcopy->list, &dev_cgroup->whitelist);spin_unlock (&dev_cgroup->lock);return 0 ; }
Signature · 1 line
1.5.3.4
Quoted 11 lines · Pavel Emelyanov
Consider you added a 'c foo:bar r' permission to some cgroup and then (a bit later) 'c'foo:bar w' for it. After this you'll see a c foo:bar r
c foo:bar w
lines in a devices.list file.Another example - consider you added 10 'c foo:bar r' permissions to some cgroup (e.g. by mistake). After this you'll see 10
c foo:bar r
lines in a list file.
Quoted 8 lines
This is weird. This situation also has one more annoying consequence. Having many items in a white list makes permissions checking slower, sine it has to walk a longer list.
The proposal is to merge permissions for items, that correspond to the same device.
Signed-off-by Pavel Emelyanov <[email protected]>
Thanks. I suppose if it was deemed worth it, the other thing you could do would be to detect when you have a rule
c foo:bar r
and you add a rule
c foo:(all) r
-serge
Quoted 42 lines
--- security/device_cgroup.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-)security/device_cgroup.c +16
-2@@ -106,7 +106,7 @@ free_and_exit:static int dev_whitelist_add (struct dev_cgroup *dev_cgroup,struct dev_whitelist_item *wh) { -struct dev_whitelist_item *whcopy; +struct dev_whitelist_item *whcopy, *walk; whcopy =kmalloc (sizeof (*whcopy),GFP_KERNEL );if (!whcopy)@@ -114,7 +114,21 @@ static int dev_whitelist_add(struct dev_cgroup *dev_cgroup,memcpy (whcopy, wh,sizeof (*whcopy));spin_lock (&dev_cgroup->lock); -list_add_tail (&whcopy->list, &dev_cgroup->whitelist); +list_for_each_entry (walk, &dev_cgroup->whitelist, list) { +if (walk->type != wh->type) +continue ; +if (walk->major != wh->major) +continue ; +if (walk->minor != wh->minor) +continue ; + + walk->access |= wh->access; +kfree (whcopy); + whcopy =NULL ; + } + +if (whcopy !=NULL ) +list_add_tail (&whcopy->list, &dev_cgroup->whitelist);spin_unlock (&dev_cgroup->lock);return 0 ; }Signature · 1 line
1.5.3.4
Quoted 23 lines · Serge E. Hallyn
Quoted 11 lines · Pavel Emelyanov
Consider you added a 'c foo:bar r' permission to some cgroup and then (a bit later) 'c'foo:bar w' for it. After this you'll see a c foo:bar r
c foo:bar w
lines in a devices.list file.Another example - consider you added 10 'c foo:bar r' permissions to some cgroup (e.g. by mistake). After this you'll see 10
c foo:bar r
lines in a list file.Quoted 8 lines
This is weird. This situation also has one more annoying consequence. Having many items in a white list makes permissions checking slower, sine it has to walk a longer list.
The proposal is to merge permissions for items, that correspond to the same device.
Signed-off-by Pavel Emelyanov <[email protected]>Acked-by Serge Hallyn <[email protected]>
Quoted 8 lines
Thanks. I suppose if it was deemed worth it, the other thing you could do would be to detect when you have a rule
c foo:bar r
and you add a rule
c foo:(all) r
But a private email response preferred the each-entry-is-separate semantics, so I retract that suggestion.
-serge