On Wed, Sep 13, 2023 at 11:23 AM Miklos Szeredi <mszeredi@xxxxxxxxxx> wrote: > > Add a way to query attributes of a single mount instead of having to parse > the complete /proc/$PID/mountinfo, which might be huge. > > Lookup the mount by the old (32bit) or new (64bit) mount ID. If a mount > needs to be queried based on path, then statx(2) can be used to first query > the mount ID belonging to the path. > > Design is based on a suggestion by Linus: > > "So I'd suggest something that is very much like "statfsat()", which gets > a buffer and a length, and returns an extended "struct statfs" *AND* > just a string description at the end." > > The interface closely mimics that of statx. > > Handle ASCII attributes by appending after the end of the structure (as per > above suggestion). Allow querying multiple string attributes with > individual offset/length for each. String are nul terminated (termination > isn't counted in length). > > Mount options are also delimited with nul characters. Unlike proc, special > characters are not quoted. > > Link: https://lore.kernel.org/all/CAHk-=wh5YifP7hzKSbwJj94+DZ2czjrZsczy6GBimiogZws=rg@xxxxxxxxxxxxxx/ > Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> > --- > arch/x86/entry/syscalls/syscall_64.tbl | 1 + > fs/internal.h | 5 + > fs/namespace.c | 312 ++++++++++++++++++++++++- > fs/proc_namespace.c | 19 +- > fs/statfs.c | 1 + > include/linux/syscalls.h | 3 + > include/uapi/asm-generic/unistd.h | 5 +- > include/uapi/linux/mount.h | 36 +++ > 8 files changed, 373 insertions(+), 9 deletions(-) ... > diff --git a/fs/namespace.c b/fs/namespace.c > index de47c5f66e17..088a52043bba 100644 > --- a/fs/namespace.c > +++ b/fs/namespace.c ... > +static int do_statmnt(struct stmt_state *s) > +{ > + struct statmnt *sm = &s->sm; > + struct mount *m = real_mount(s->mnt); > + > + if (!capable(CAP_SYS_ADMIN) && > + !is_path_reachable(m, m->mnt.mnt_root, &s->root)) > + return -EPERM; I realize statmnt() is different from fstatfs(), but from an access control perspective they look a lot alike to me which is why I think we should probably have a security_sb_statfs() call here. Same thing for the listmnt() syscall in patch 3/3. > + stmt_numeric(s, STMT_SB_BASIC, stmt_sb_basic); > + stmt_numeric(s, STMT_MNT_BASIC, stmt_mnt_basic); > + stmt_numeric(s, STMT_PROPAGATE_FROM, stmt_propagate_from); > + stmt_string(s, STMT_MNT_ROOT, stmt_mnt_root, &sm->mnt_root); > + stmt_string(s, STMT_MOUNTPOINT, stmt_mountpoint, &sm->mountpoint); > + stmt_string(s, STMT_FS_TYPE, stmt_fs_type, &sm->fs_type); > + stmt_string(s, STMT_SB_OPTS, stmt_sb_opts, &sm->sb_opts); > + > + if (s->err) > + return s->err; > + > + if (copy_to_user(s->buf, sm, min_t(size_t, s->bufsize, sizeof(*sm)))) > + return -EFAULT; > + > + return 0; > +} -- paul-moore.com