userns: Make the count of user namespaces per user
[cascardo/linux.git] / kernel / ucount.c
1 /*
2  *  This program is free software; you can redistribute it and/or
3  *  modify it under the terms of the GNU General Public License as
4  *  published by the Free Software Foundation, version 2 of the
5  *  License.
6  */
7
8 #include <linux/stat.h>
9 #include <linux/sysctl.h>
10 #include <linux/slab.h>
11 #include <linux/hash.h>
12 #include <linux/user_namespace.h>
13
14 #define UCOUNTS_HASHTABLE_BITS 10
15 static struct hlist_head ucounts_hashtable[(1 << UCOUNTS_HASHTABLE_BITS)];
16 static DEFINE_SPINLOCK(ucounts_lock);
17
18 #define ucounts_hashfn(ns, uid)                                         \
19         hash_long((unsigned long)__kuid_val(uid) + (unsigned long)(ns), \
20                   UCOUNTS_HASHTABLE_BITS)
21 #define ucounts_hashentry(ns, uid)      \
22         (ucounts_hashtable + ucounts_hashfn(ns, uid))
23
24
25 #ifdef CONFIG_SYSCTL
26 static struct ctl_table_set *
27 set_lookup(struct ctl_table_root *root)
28 {
29         return &current_user_ns()->set;
30 }
31
32 static int set_is_seen(struct ctl_table_set *set)
33 {
34         return &current_user_ns()->set == set;
35 }
36
37 static int set_permissions(struct ctl_table_header *head,
38                                   struct ctl_table *table)
39 {
40         struct user_namespace *user_ns =
41                 container_of(head->set, struct user_namespace, set);
42         int mode;
43
44         /* Allow users with CAP_SYS_RESOURCE unrestrained access */
45         if (ns_capable(user_ns, CAP_SYS_RESOURCE))
46                 mode = (table->mode & S_IRWXU) >> 6;
47         else
48         /* Allow all others at most read-only access */
49                 mode = table->mode & S_IROTH;
50         return (mode << 6) | (mode << 3) | mode;
51 }
52
53 static struct ctl_table_root set_root = {
54         .lookup = set_lookup,
55         .permissions = set_permissions,
56 };
57
58 static int zero = 0;
59 static int int_max = INT_MAX;
60 static struct ctl_table user_table[] = {
61         {
62                 .procname       = "max_user_namespaces",
63                 .data           = &init_user_ns.max_user_namespaces,
64                 .maxlen         = sizeof(init_user_ns.max_user_namespaces),
65                 .mode           = 0644,
66                 .proc_handler   = proc_dointvec_minmax,
67                 .extra1         = &zero,
68                 .extra2         = &int_max,
69         },
70         { }
71 };
72 #endif /* CONFIG_SYSCTL */
73
74 bool setup_userns_sysctls(struct user_namespace *ns)
75 {
76 #ifdef CONFIG_SYSCTL
77         struct ctl_table *tbl;
78         setup_sysctl_set(&ns->set, &set_root, set_is_seen);
79         tbl = kmemdup(user_table, sizeof(user_table), GFP_KERNEL);
80         if (tbl) {
81                 tbl[0].data = &ns->max_user_namespaces;
82
83                 ns->sysctls = __register_sysctl_table(&ns->set, "user", tbl);
84         }
85         if (!ns->sysctls) {
86                 kfree(tbl);
87                 retire_sysctl_set(&ns->set);
88                 return false;
89         }
90 #endif
91         return true;
92 }
93
94 void retire_userns_sysctls(struct user_namespace *ns)
95 {
96 #ifdef CONFIG_SYSCTL
97         struct ctl_table *tbl;
98
99         tbl = ns->sysctls->ctl_table_arg;
100         unregister_sysctl_table(ns->sysctls);
101         retire_sysctl_set(&ns->set);
102         kfree(tbl);
103 #endif
104 }
105
106 static struct ucounts *find_ucounts(struct user_namespace *ns, kuid_t uid, struct hlist_head *hashent)
107 {
108         struct ucounts *ucounts;
109
110         hlist_for_each_entry(ucounts, hashent, node) {
111                 if (uid_eq(ucounts->uid, uid) && (ucounts->ns == ns))
112                         return ucounts;
113         }
114         return NULL;
115 }
116
117 static struct ucounts *get_ucounts(struct user_namespace *ns, kuid_t uid)
118 {
119         struct hlist_head *hashent = ucounts_hashentry(ns, uid);
120         struct ucounts *ucounts, *new;
121
122         spin_lock(&ucounts_lock);
123         ucounts = find_ucounts(ns, uid, hashent);
124         if (!ucounts) {
125                 spin_unlock(&ucounts_lock);
126
127                 new = kzalloc(sizeof(*new), GFP_KERNEL);
128                 if (!new)
129                         return NULL;
130
131                 new->ns = ns;
132                 new->uid = uid;
133                 atomic_set(&new->count, 0);
134
135                 spin_lock(&ucounts_lock);
136                 ucounts = find_ucounts(ns, uid, hashent);
137                 if (ucounts) {
138                         kfree(new);
139                 } else {
140                         hlist_add_head(&new->node, hashent);
141                         ucounts = new;
142                 }
143         }
144         if (!atomic_add_unless(&ucounts->count, 1, INT_MAX))
145                 ucounts = NULL;
146         spin_unlock(&ucounts_lock);
147         return ucounts;
148 }
149
150 static void put_ucounts(struct ucounts *ucounts)
151 {
152         if (atomic_dec_and_test(&ucounts->count)) {
153                 spin_lock(&ucounts_lock);
154                 hlist_del_init(&ucounts->node);
155                 spin_unlock(&ucounts_lock);
156
157                 kfree(ucounts);
158         }
159 }
160
161 static inline bool atomic_inc_below(atomic_t *v, int u)
162 {
163         int c, old;
164         c = atomic_read(v);
165         for (;;) {
166                 if (unlikely(c >= u))
167                         return false;
168                 old = atomic_cmpxchg(v, c, c+1);
169                 if (likely(old == c))
170                         return true;
171                 c = old;
172         }
173 }
174
175 struct ucounts *inc_user_namespaces(struct user_namespace *ns, kuid_t uid)
176 {
177         struct ucounts *ucounts, *iter, *bad;
178         struct user_namespace *tns;
179         ucounts = get_ucounts(ns, uid);
180         for (iter = ucounts; iter; iter = tns->ucounts) {
181                 int max;
182                 tns = iter->ns;
183                 max = READ_ONCE(tns->max_user_namespaces);
184                 if (!atomic_inc_below(&iter->user_namespaces, max))
185                         goto fail;
186         }
187         return ucounts;
188 fail:
189         bad = iter;
190         for (iter = ucounts; iter != bad; iter = iter->ns->ucounts)
191                 atomic_dec(&iter->user_namespaces);
192
193         put_ucounts(ucounts);
194         return NULL;
195 }
196
197 void dec_user_namespaces(struct ucounts *ucounts)
198 {
199         struct ucounts *iter;
200         for (iter = ucounts; iter; iter = iter->ns->ucounts) {
201                 int dec = atomic_dec_if_positive(&iter->user_namespaces);
202                 WARN_ON_ONCE(dec < 0);
203         }
204         put_ucounts(ucounts);
205 }
206
207
208 static __init int user_namespace_sysctl_init(void)
209 {
210 #ifdef CONFIG_SYSCTL
211         static struct ctl_table_header *user_header;
212         static struct ctl_table empty[1];
213         /*
214          * It is necessary to register the user directory in the
215          * default set so that registrations in the child sets work
216          * properly.
217          */
218         user_header = register_sysctl("user", empty);
219         BUG_ON(!user_header);
220         BUG_ON(!setup_userns_sysctls(&init_user_ns));
221 #endif
222         return 0;
223 }
224 subsys_initcall(user_namespace_sysctl_init);
225
226