ANDROID: make sure proc mount options are applied

Android relies on the "hidepid" mount option for /proc on
the 2nd mount, however the upstream kernel requires options
on the first mount and ignores options afterwards.

In prevous Android kernels, this was fixed by reverting
upstream commit e94591d0d9 ("proc: Convert proc_mount
to use mount_ns."). The upstream code has now been
refactored to the point that a new fix is needed. This
patch applies mount options during proc_get_tree() to
ensure the most recently parsed options are applied.

Bug: 145626724
Test: atest CtsOsTestCases:android.os.cts.EnvironmentTest#testHidePid2
Change-Id: I3d402f98e826e2f03ad366da7d05b3eeaaa90c26
Signed-off-by: Todd Kjos <tkjos@google.com>
This commit is contained in:
Todd Kjos 2019-12-06 09:35:24 -08:00 committed by Alistair Delva
parent 3f60546293
commit 1d92317c73

View File

@ -82,8 +82,7 @@ static int proc_parse_param(struct fs_context *fc, struct fs_parameter *param)
return 0;
}
static void proc_apply_options(struct super_block *s,
struct fs_context *fc,
static void proc_apply_options(struct fs_context *fc,
struct pid_namespace *pid_ns,
struct user_namespace *user_ns)
{
@ -101,7 +100,7 @@ static int proc_fill_super(struct super_block *s, struct fs_context *fc)
struct inode *root_inode;
int ret;
proc_apply_options(s, fc, pid_ns, current_user_ns());
proc_apply_options(fc, pid_ns, current_user_ns());
/* User space would break if executables or devices appear on proc */
s->s_iflags |= SB_I_USERNS_VISIBLE | SB_I_NOEXEC | SB_I_NODEV;
@ -149,7 +148,7 @@ static int proc_reconfigure(struct fs_context *fc)
sync_filesystem(sb);
proc_apply_options(sb, fc, pid, current_user_ns());
proc_apply_options(fc, pid, current_user_ns());
return 0;
}
@ -157,6 +156,7 @@ static int proc_get_tree(struct fs_context *fc)
{
struct proc_fs_context *ctx = fc->fs_private;
proc_apply_options(fc, ctx->pid_ns, current_user_ns());
return get_tree_keyed(fc, proc_fill_super, ctx->pid_ns);
}