08 Jul, 2020

2 commits

  • There is exactly one argument so there is nothing to split. All
    split_argv does now is cause confusion and avoid the need for a cast
    when passing a "const char *" string to call_usermodehelper_setup.

    So avoid confusion and the possibility of an odd driver name causing
    problems by just using a fixed argv array with a cast in the call to
    call_usermodehelper_setup.

    v1: https://lkml.kernel.org/r/87sged3a9n.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-16-ebiederm@xmission.com
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • The bpfilter code no longer uses the umd_info.cleanup callback. This
    callback is what exit_umh exists to call. So remove exit_umh and all
    of it's associated booking.

    v1: https://lkml.kernel.org/r/87bll6dlte.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87y2o53abg.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-15-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     

04 Jul, 2020

5 commits

  • Use struct pid instead of user space pid values that are prone to wrap
    araound.

    In addition track the entire thread group instead of just the first
    thread that is started by exec. There are no multi-threaded user mode
    drivers today but there is nothing preclucing user drivers from being
    multi-threaded, so it is just a good idea to track the entire process.

    Take a reference count on the tgid's in question to make it possible
    to remove exit_umh in a future change.

    As a struct pid is available directly use kill_pid_info.

    The prior process signalling code was iffy in using a userspace pid
    known to be in the initial pid namespace and then looking up it's task
    in whatever the current pid namespace is. It worked only because
    kernel threads always run in the initial pid namespace.

    As the tgid is now refcounted verify the tgid is NULL at the start of
    fork_usermode_driver to avoid the possibility of silent pid leaks.

    v1: https://lkml.kernel.org/r/87mu4qdlv2.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/a70l4oy8.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-12-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • Instead of loading a binary blob into a temporary file with
    shmem_kernel_file_setup load a binary blob into a temporary tmpfs
    filesystem. This means that the blob can be stored in an init section
    and discared, and it means the binary blob will have a filename so can
    be executed normally.

    The only tricky thing about this code is that in the helper function
    blob_to_mnt __fput_sync is used. That is because a file can not be
    executed if it is still open for write, and the ordinary delayed close
    for kernel threads does not happen soon enough, which causes the
    following exec to fail. The function umd_load_blob is not called with
    any locks so this should be safe.

    Executing the blob normally winds up correcting several problems with
    the user mode driver code discovered by Tetsuo Handa[1]. By passing
    an ordinary filename into the exec, it is no longer necessary to
    figure out how to turn a O_RDWR file descriptor into a properly
    referende counted O_EXEC file descriptor that forbids all writes. For
    path based LSMs there are no new special cases.

    [1] https://lore.kernel.org/linux-fsdevel/2a8775b4-1dd5-9d5c-aa42-9872445e0942@i-love.sakura.ne.jp/
    v1: https://lkml.kernel.org/r/87d05mf0j9.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87wo3p4p35.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-8-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • The only thing supplied in the cmdline today is the driver name so
    rename the field to clarify the code.

    As this value is always supplied stop trying to handle the case of
    a NULL cmdline.

    Additionally since we now have a name we can count on use the
    driver_name any place where the code is looking for a name
    of the binary.

    v1: https://lkml.kernel.org/r/87imfef0k3.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87366d63os.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-7-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • This structure is only used for user mode drivers so change
    the prefix from umh to umd to make that clear.

    v1: https://lkml.kernel.org/r/87o8p6f0kw.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/878sg563po.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-6-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman
     
  • This makes it clear which code is part of the core user mode
    helper support and which code is needed to implement user mode
    drivers.

    This makes the kernel smaller for everyone who does not use a usermode
    driver.

    v1: https://lkml.kernel.org/r/87tuyyf0ln.fsf_-_@x220.int.ebiederm.org
    v2: https://lkml.kernel.org/r/87imf963s6.fsf_-_@x220.int.ebiederm.org
    Link: https://lkml.kernel.org/r/20200702164140.4468-5-ebiederm@xmission.com
    Reviewed-by: Greg Kroah-Hartman
    Acked-by: Alexei Starovoitov
    Tested-by: Alexei Starovoitov
    Signed-off-by: "Eric W. Biederman"

    Eric W. Biederman