|
@@ -2732,6 +2732,30 @@ bool our_mnt(struct vfsmount *mnt)
|
|
|
return check_mnt(real_mount(mnt));
|
|
|
}
|
|
|
|
|
|
+bool current_chrooted(void)
|
|
|
+{
|
|
|
+ /* Does the current process have a non-standard root */
|
|
|
+ struct path ns_root;
|
|
|
+ struct path fs_root;
|
|
|
+ bool chrooted;
|
|
|
+
|
|
|
+ /* Find the namespace root */
|
|
|
+ ns_root.mnt = ¤t->nsproxy->mnt_ns->root->mnt;
|
|
|
+ ns_root.dentry = ns_root.mnt->mnt_root;
|
|
|
+ path_get(&ns_root);
|
|
|
+ while (d_mountpoint(ns_root.dentry) && follow_down_one(&ns_root))
|
|
|
+ ;
|
|
|
+
|
|
|
+ get_fs_root(current->fs, &fs_root);
|
|
|
+
|
|
|
+ chrooted = !path_equal(&fs_root, &ns_root);
|
|
|
+
|
|
|
+ path_put(&fs_root);
|
|
|
+ path_put(&ns_root);
|
|
|
+
|
|
|
+ return chrooted;
|
|
|
+}
|
|
|
+
|
|
|
static void *mntns_get(struct task_struct *task)
|
|
|
{
|
|
|
struct mnt_namespace *ns = NULL;
|