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
8 #include <linux/module.h>
9 #include <linux/nsproxy.h>
10 #include <linux/slab.h>
11 #include <linux/user_namespace.h>
14 * Clone a new ns copying an original user ns, setting refcount to 1
15 * @old_ns: namespace to clone
16 * Return NULL on error (failure to kmalloc), new ns otherwise
18 static struct user_namespace
*clone_user_ns(struct user_namespace
*old_ns
)
20 struct user_namespace
*ns
;
21 struct user_struct
*new_user
;
24 ns
= kmalloc(sizeof(struct user_namespace
), GFP_KERNEL
);
26 return ERR_PTR(-ENOMEM
);
30 for (n
= 0; n
< UIDHASH_SZ
; ++n
)
31 INIT_HLIST_HEAD(ns
->uidhash_table
+ n
);
33 /* Insert new root user. */
34 ns
->root_user
= alloc_uid(ns
, 0);
37 return ERR_PTR(-ENOMEM
);
40 /* Reset current->user with a new one */
41 new_user
= alloc_uid(ns
, current
->uid
);
43 free_uid(ns
->root_user
);
45 return ERR_PTR(-ENOMEM
);
52 struct user_namespace
* copy_user_ns(int flags
, struct user_namespace
*old_ns
)
54 struct user_namespace
*new_ns
;
59 if (!(flags
& CLONE_NEWUSER
))
62 new_ns
= clone_user_ns(old_ns
);
68 void free_user_ns(struct kref
*kref
)
70 struct user_namespace
*ns
;
72 ns
= container_of(kref
, struct user_namespace
, kref
);
76 EXPORT_SYMBOL(free_user_ns
);