lkml.org 
[lkml]   [2021]   [Dec]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 02/15] mm/memfd: Introduce MFD_INACCESSIBLE flag
    Date
    Introduce a new memfd_create() flag indicating the content of the
    created memfd is inaccessible from userspace. It does this by force
    setting F_SEAL_INACCESSIBLE seal when the file is created. It also set
    F_SEAL_SEAL to prevent future sealing, which means, it can not coexist
    with MFD_ALLOW_SEALING.

    Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com>
    ---
    include/uapi/linux/memfd.h | 1 +
    mm/memfd.c | 12 +++++++++++-
    2 files changed, 12 insertions(+), 1 deletion(-)

    diff --git a/include/uapi/linux/memfd.h b/include/uapi/linux/memfd.h
    index 7a8a26751c23..48750474b904 100644
    --- a/include/uapi/linux/memfd.h
    +++ b/include/uapi/linux/memfd.h
    @@ -8,6 +8,7 @@
    #define MFD_CLOEXEC 0x0001U
    #define MFD_ALLOW_SEALING 0x0002U
    #define MFD_HUGETLB 0x0004U
    +#define MFD_INACCESSIBLE 0x0008U

    /*
    * Huge page size encoding when MFD_HUGETLB is specified, and a huge page
    diff --git a/mm/memfd.c b/mm/memfd.c
    index 9f80f162791a..c898a007fb76 100644
    --- a/mm/memfd.c
    +++ b/mm/memfd.c
    @@ -245,7 +245,8 @@ long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
    #define MFD_NAME_PREFIX_LEN (sizeof(MFD_NAME_PREFIX) - 1)
    #define MFD_NAME_MAX_LEN (NAME_MAX - MFD_NAME_PREFIX_LEN)

    -#define MFD_ALL_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB)
    +#define MFD_ALL_FLAGS (MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB | \
    + MFD_INACCESSIBLE)

    SYSCALL_DEFINE2(memfd_create,
    const char __user *, uname,
    @@ -267,6 +268,10 @@ SYSCALL_DEFINE2(memfd_create,
    return -EINVAL;
    }

    + /* Disallow sealing when MFD_INACCESSIBLE is set. */
    + if (flags & MFD_INACCESSIBLE && flags & MFD_ALLOW_SEALING)
    + return -EINVAL;
    +
    /* length includes terminating zero */
    len = strnlen_user(uname, MFD_NAME_MAX_LEN + 1);
    if (len <= 0)
    @@ -315,6 +320,11 @@ SYSCALL_DEFINE2(memfd_create,
    *file_seals &= ~F_SEAL_SEAL;
    }

    + if (flags & MFD_INACCESSIBLE) {
    + file_seals = memfd_file_seals_ptr(file);
    + *file_seals &= F_SEAL_SEAL | F_SEAL_INACCESSIBLE;
    + }
    +
    fd_install(fd, file);
    kfree(name);
    return fd;
    --
    2.17.1
    \
     
     \ /
      Last update: 2021-12-21 16:12    [W:6.348 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site