Commit c5e0666c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace

Pull userns fix from Eric Biederman:
 "This contains just a single fix for a nasty oops"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace:
  propogate_mnt: Handle the first propogated copy being a slave
parents 3cedbec3 5ec0811d
...@@ -198,7 +198,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin) ...@@ -198,7 +198,7 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
/* all accesses are serialized by namespace_sem */ /* all accesses are serialized by namespace_sem */
static struct user_namespace *user_ns; static struct user_namespace *user_ns;
static struct mount *last_dest, *last_source, *dest_master; static struct mount *last_dest, *first_source, *last_source, *dest_master;
static struct mountpoint *mp; static struct mountpoint *mp;
static struct hlist_head *list; static struct hlist_head *list;
...@@ -221,20 +221,22 @@ static int propagate_one(struct mount *m) ...@@ -221,20 +221,22 @@ static int propagate_one(struct mount *m)
type = CL_MAKE_SHARED; type = CL_MAKE_SHARED;
} else { } else {
struct mount *n, *p; struct mount *n, *p;
bool done;
for (n = m; ; n = p) { for (n = m; ; n = p) {
p = n->mnt_master; p = n->mnt_master;
if (p == dest_master || IS_MNT_MARKED(p)) { if (p == dest_master || IS_MNT_MARKED(p))
while (last_dest->mnt_master != p) {
last_source = last_source->mnt_master;
last_dest = last_source->mnt_parent;
}
if (!peers(n, last_dest)) {
last_source = last_source->mnt_master;
last_dest = last_source->mnt_parent;
}
break; break;
}
} }
do {
struct mount *parent = last_source->mnt_parent;
if (last_source == first_source)
break;
done = parent->mnt_master == p;
if (done && peers(n, parent))
break;
last_source = last_source->mnt_master;
} while (!done);
type = CL_SLAVE; type = CL_SLAVE;
/* beginning of peer group among the slaves? */ /* beginning of peer group among the slaves? */
if (IS_MNT_SHARED(m)) if (IS_MNT_SHARED(m))
...@@ -286,6 +288,7 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp, ...@@ -286,6 +288,7 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp,
*/ */
user_ns = current->nsproxy->mnt_ns->user_ns; user_ns = current->nsproxy->mnt_ns->user_ns;
last_dest = dest_mnt; last_dest = dest_mnt;
first_source = source_mnt;
last_source = source_mnt; last_source = source_mnt;
mp = dest_mp; mp = dest_mp;
list = tree_list; list = tree_list;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment