cgroup has to be one kernfs dir, otherwise kernel panic is caused, especially cgroup id is provide from userspace.
Unified · Split
| @@ -6049,6 +6049,9 @@ struct cgroup *cgroup_get_from_id(u64 id) · 6048 unmodified lines | |||
| 6049 | if (!kn) | 6049 | if (!kn) |
| 6050 | goto out; | 6050 | goto out; |
| 6051 | 6051 | ||
| 6052 | if (kernfs_type(kn) != KERNFS_DIR) | ||
| 6053 | goto put; | ||
| 6054 | |||
| 6052 | rcu_read_lock(); | 6055 | rcu_read_lock(); |
| 6053 | 6056 | ||
| 6054 | cgrp = rcu_dereference(*(void __rcu __force **)&kn->priv); | 6057 | cgrp = rcu_dereference(*(void __rcu __force **)&kn->priv); |
| @@ -6056,7 +6059,7 @@ struct cgroup *cgroup_get_from_id(u64 id) · 1 unmodified line | |||
| 6056 | cgrp = NULL; | 6059 | cgrp = NULL; |
| 6057 | 6060 | ||
| 6058 | rcu_read_unlock(); | 6061 | rcu_read_unlock(); |
| 6059 | 6062 | put: | |
| 6060 | kernfs_put(kn); | 6063 | kernfs_put(kn); |
| 6061 | out: | 6064 | out: |
| 6062 | return cgrp; | 6065 | return cgrp; |