do_move_mount(): split the checks in subtree-of-our-ns and entire-anon cases
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 6 Jun 2025 22:31:03 +0000 (18:31 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 7 Jun 2025 04:41:20 +0000 (00:41 -0400)
commit290da20e333955637f00647d9fff7c6e3c0b61e0
tree718213139fc7a508b217297d387d3c911224fd52
parent4954346d80fb047cb78776d9f2ebd6a050f80c5f
do_move_mount(): split the checks in subtree-of-our-ns and entire-anon cases

... and fix the breakage in anon-to-anon case.  There are two cases
acceptable for do_move_mount() and mixing checks for those is making
things hard to follow.

One case is move of a subtree in caller's namespace.
        * source and destination must be in caller's namespace
* source must be detachable from parent
Another is moving the entire anon namespace elsewhere
* source must be the root of anon namespace
* target must either in caller's namespace or in a suitable
  anon namespace (see may_use_mount() for details).
* target must not be in the same namespace as source.

It's really easier to follow if tests are *not* mixed together...

Reviewed-by: Christian Brauner <brauner@kernel.org>
Fixes: 3b5260d12b1f ("Don't propagate mounts into detached trees")
Reported-by: Allison Karlitskaya <lis@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c