1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/mount.h>
3 #include <linux/pseudo_fs.h>
4 #include <linux/file.h>
6 #include <linux/proc_fs.h>
7 #include <linux/proc_ns.h>
8 #include <linux/magic.h>
9 #include <linux/ktime.h>
10 #include <linux/seq_file.h>
11 #include <linux/pid_namespace.h>
12 #include <linux/user_namespace.h>
13 #include <linux/nsfs.h>
14 #include <linux/uaccess.h>
15 #include <linux/mnt_namespace.h>
20 static struct vfsmount
*nsfs_mnt
;
22 static long ns_ioctl(struct file
*filp
, unsigned int ioctl
,
24 static const struct file_operations ns_file_operations
= {
25 .unlocked_ioctl
= ns_ioctl
,
26 .compat_ioctl
= compat_ptr_ioctl
,
29 static char *ns_dname(struct dentry
*dentry
, char *buffer
, int buflen
)
31 struct inode
*inode
= d_inode(dentry
);
32 struct ns_common
*ns
= inode
->i_private
;
33 const struct proc_ns_operations
*ns_ops
= ns
->ops
;
35 return dynamic_dname(buffer
, buflen
, "%s:[%lu]",
36 ns_ops
->name
, inode
->i_ino
);
39 const struct dentry_operations ns_dentry_operations
= {
40 .d_delete
= always_delete_dentry
,
42 .d_prune
= stashed_dentry_prune
,
45 static void nsfs_evict(struct inode
*inode
)
47 struct ns_common
*ns
= inode
->i_private
;
52 int ns_get_path_cb(struct path
*path
, ns_get_path_helper_t
*ns_get_cb
,
57 ns
= ns_get_cb(private_data
);
61 return path_from_stashed(&ns
->stashed
, nsfs_mnt
, ns
, path
);
64 struct ns_get_path_task_args
{
65 const struct proc_ns_operations
*ns_ops
;
66 struct task_struct
*task
;
69 static struct ns_common
*ns_get_path_task(void *private_data
)
71 struct ns_get_path_task_args
*args
= private_data
;
73 return args
->ns_ops
->get(args
->task
);
76 int ns_get_path(struct path
*path
, struct task_struct
*task
,
77 const struct proc_ns_operations
*ns_ops
)
79 struct ns_get_path_task_args args
= {
84 return ns_get_path_cb(path
, ns_get_path_task
, &args
);
88 * open_namespace - open a namespace
89 * @ns: the namespace to open
91 * This will consume a reference to @ns indendent of success or failure.
93 * Return: A file descriptor on success or a negative error code on failure.
95 int open_namespace(struct ns_common
*ns
)
97 struct path path
__free(path_put
) = {};
101 /* call first to consume reference */
102 err
= path_from_stashed(&ns
->stashed
, nsfs_mnt
, ns
, &path
);
106 CLASS(get_unused_fd
, fd
)(O_CLOEXEC
);
110 f
= dentry_open(&path
, O_RDONLY
, current_cred());
118 int open_related_ns(struct ns_common
*ns
,
119 struct ns_common
*(*get_ns
)(struct ns_common
*ns
))
121 struct ns_common
*relative
;
123 relative
= get_ns(ns
);
124 if (IS_ERR(relative
))
125 return PTR_ERR(relative
);
127 return open_namespace(relative
);
129 EXPORT_SYMBOL_GPL(open_related_ns
);
131 static int copy_ns_info_to_user(const struct mnt_namespace
*mnt_ns
,
132 struct mnt_ns_info __user
*uinfo
, size_t usize
,
133 struct mnt_ns_info
*kinfo
)
136 * If userspace and the kernel have the same struct size it can just
137 * be copied. If userspace provides an older struct, only the bits that
138 * userspace knows about will be copied. If userspace provides a new
139 * struct, only the bits that the kernel knows aobut will be copied and
140 * the size value will be set to the size the kernel knows about.
142 kinfo
->size
= min(usize
, sizeof(*kinfo
));
143 kinfo
->mnt_ns_id
= mnt_ns
->seq
;
144 kinfo
->nr_mounts
= READ_ONCE(mnt_ns
->nr_mounts
);
145 /* Subtract the root mount of the mount namespace. */
146 if (kinfo
->nr_mounts
)
149 if (copy_to_user(uinfo
, kinfo
, kinfo
->size
))
155 static long ns_ioctl(struct file
*filp
, unsigned int ioctl
,
158 struct user_namespace
*user_ns
;
159 struct pid_namespace
*pid_ns
;
160 struct task_struct
*tsk
;
161 struct ns_common
*ns
= get_proc_ns(file_inode(filp
));
162 struct mnt_namespace
*mnt_ns
;
163 bool previous
= false;
170 return open_related_ns(ns
, ns_get_owner
);
172 if (!ns
->ops
->get_parent
)
174 return open_related_ns(ns
, ns
->ops
->get_parent
);
176 return ns
->ops
->type
;
177 case NS_GET_OWNER_UID
:
178 if (ns
->ops
->type
!= CLONE_NEWUSER
)
180 user_ns
= container_of(ns
, struct user_namespace
, ns
);
181 argp
= (uid_t __user
*) arg
;
182 uid
= from_kuid_munged(current_user_ns(), user_ns
->owner
);
183 return put_user(uid
, argp
);
184 case NS_GET_MNTNS_ID
: {
188 if (ns
->ops
->type
!= CLONE_NEWNS
)
191 mnt_ns
= container_of(ns
, struct mnt_namespace
, ns
);
192 idp
= (__u64 __user
*)arg
;
194 return put_user(id
, idp
);
196 case NS_GET_PID_FROM_PIDNS
:
198 case NS_GET_TGID_FROM_PIDNS
:
200 case NS_GET_PID_IN_PIDNS
:
202 case NS_GET_TGID_IN_PIDNS
: {
203 if (ns
->ops
->type
!= CLONE_NEWPID
)
207 pid_ns
= container_of(ns
, struct pid_namespace
, ns
);
211 if (ioctl
== NS_GET_PID_IN_PIDNS
||
212 ioctl
== NS_GET_TGID_IN_PIDNS
)
213 tsk
= find_task_by_vpid(arg
);
215 tsk
= find_task_by_pid_ns(arg
, pid_ns
);
220 case NS_GET_PID_FROM_PIDNS
:
221 ret
= task_pid_vnr(tsk
);
223 case NS_GET_TGID_FROM_PIDNS
:
224 ret
= task_tgid_vnr(tsk
);
226 case NS_GET_PID_IN_PIDNS
:
227 ret
= task_pid_nr_ns(tsk
, pid_ns
);
229 case NS_GET_TGID_IN_PIDNS
:
230 ret
= task_tgid_nr_ns(tsk
, pid_ns
);
243 /* extensible ioctls */
244 switch (_IOC_NR(ioctl
)) {
245 case _IOC_NR(NS_MNT_GET_INFO
): {
246 struct mnt_ns_info kinfo
= {};
247 struct mnt_ns_info __user
*uinfo
= (struct mnt_ns_info __user
*)arg
;
248 size_t usize
= _IOC_SIZE(ioctl
);
250 if (ns
->ops
->type
!= CLONE_NEWNS
)
256 if (usize
< MNT_NS_INFO_SIZE_VER0
)
259 return copy_ns_info_to_user(to_mnt_ns(ns
), uinfo
, usize
, &kinfo
);
261 case _IOC_NR(NS_MNT_GET_PREV
):
264 case _IOC_NR(NS_MNT_GET_NEXT
): {
265 struct mnt_ns_info kinfo
= {};
266 struct mnt_ns_info __user
*uinfo
= (struct mnt_ns_info __user
*)arg
;
267 struct path path
__free(path_put
) = {};
268 struct file
*f
__free(fput
) = NULL
;
269 size_t usize
= _IOC_SIZE(ioctl
);
271 if (ns
->ops
->type
!= CLONE_NEWNS
)
274 if (usize
< MNT_NS_INFO_SIZE_VER0
)
278 mnt_ns
= lookup_prev_mnt_ns(to_mnt_ns(ns
));
280 mnt_ns
= lookup_next_mnt_ns(to_mnt_ns(ns
));
282 return PTR_ERR(mnt_ns
);
284 ns
= to_ns_common(mnt_ns
);
285 /* Transfer ownership of @mnt_ns reference to @path. */
286 ret
= path_from_stashed(&ns
->stashed
, nsfs_mnt
, ns
, &path
);
290 CLASS(get_unused_fd
, fd
)(O_CLOEXEC
);
294 f
= dentry_open(&path
, O_RDONLY
, current_cred());
300 * If @uinfo is passed return all information about the
301 * mount namespace as well.
303 ret
= copy_ns_info_to_user(to_mnt_ns(ns
), uinfo
, usize
, &kinfo
);
308 /* Transfer reference of @f to caller's fdtable. */
309 fd_install(fd
, no_free_ptr(f
));
310 /* File descriptor is live so hand it off to the caller. */
320 int ns_get_name(char *buf
, size_t size
, struct task_struct
*task
,
321 const struct proc_ns_operations
*ns_ops
)
323 struct ns_common
*ns
;
326 ns
= ns_ops
->get(task
);
328 name
= ns_ops
->real_ns_name
? : ns_ops
->name
;
329 res
= snprintf(buf
, size
, "%s:[%u]", name
, ns
->inum
);
335 bool proc_ns_file(const struct file
*file
)
337 return file
->f_op
== &ns_file_operations
;
341 * ns_match() - Returns true if current namespace matches dev/ino provided.
342 * @ns: current namespace
343 * @dev: dev_t from nsfs that will be matched against current nsfs
344 * @ino: ino_t from nsfs that will be matched against current nsfs
346 * Return: true if dev and ino matches the current nsfs.
348 bool ns_match(const struct ns_common
*ns
, dev_t dev
, ino_t ino
)
350 return (ns
->inum
== ino
) && (nsfs_mnt
->mnt_sb
->s_dev
== dev
);
354 static int nsfs_show_path(struct seq_file
*seq
, struct dentry
*dentry
)
356 struct inode
*inode
= d_inode(dentry
);
357 const struct ns_common
*ns
= inode
->i_private
;
358 const struct proc_ns_operations
*ns_ops
= ns
->ops
;
360 seq_printf(seq
, "%s:[%lu]", ns_ops
->name
, inode
->i_ino
);
364 static const struct super_operations nsfs_ops
= {
365 .statfs
= simple_statfs
,
366 .evict_inode
= nsfs_evict
,
367 .show_path
= nsfs_show_path
,
370 static int nsfs_init_inode(struct inode
*inode
, void *data
)
372 struct ns_common
*ns
= data
;
374 inode
->i_private
= data
;
375 inode
->i_mode
|= S_IRUGO
;
376 inode
->i_fop
= &ns_file_operations
;
377 inode
->i_ino
= ns
->inum
;
381 static void nsfs_put_data(void *data
)
383 struct ns_common
*ns
= data
;
387 static const struct stashed_operations nsfs_stashed_ops
= {
388 .init_inode
= nsfs_init_inode
,
389 .put_data
= nsfs_put_data
,
392 static int nsfs_init_fs_context(struct fs_context
*fc
)
394 struct pseudo_fs_context
*ctx
= init_pseudo(fc
, NSFS_MAGIC
);
397 ctx
->ops
= &nsfs_ops
;
398 ctx
->dops
= &ns_dentry_operations
;
399 fc
->s_fs_info
= (void *)&nsfs_stashed_ops
;
403 static struct file_system_type nsfs
= {
405 .init_fs_context
= nsfs_init_fs_context
,
406 .kill_sb
= kill_anon_super
,
409 void __init
nsfs_init(void)
411 nsfs_mnt
= kern_mount(&nsfs
);
412 if (IS_ERR(nsfs_mnt
))
413 panic("can't set nsfs up\n");
414 nsfs_mnt
->mnt_sb
->s_flags
&= ~SB_NOUSER
;