• Eric W. Biederman's avatar
    exec: Remove recursion from search_binary_handler · bc2bf338
    Eric W. Biederman authored
    Recursion in kernel code is generally a bad idea as it can overflow
    the kernel stack.  Recursion in exec also hides that the code is
    looping and that the loop changes bprm->file.
    
    Instead of recursing in search_binary_handler have the methods that
    would recurse set bprm->interpreter and return 0.  Modify exec_binprm
    to loop when bprm->interpreter is set.  Consolidate all of the
    reassignments of bprm->file in that loop to make it clear what is
    going on.
    
    The structure of the new loop in exec_binprm is that all errors return
    immediately, while successful completion (ret == 0 &&
    !bprm->interpreter) just breaks out of the loop and runs what
    exec_bprm has always run upon successful completion.
    
    Fail if the an interpreter is being call after execfd has been set.
    The code has never properly handled an interpreter being called with
    execfd being set and with reassignments of bprm->file and the
    assignment of bprm->executable in generic code it has finally become
    possible to test and fail when if this problematic condition happens.
    
    With the reassignments of bprm->file and the assignment of
    bprm->executable moved into the generic code add a test to see if
    bprm->executable is being reassigned.
    
    In search_binary_handler remove the test for !bprm->file.  With all
    reassignments of bprm->file moved to exec_binprm bprm->file can never
    be NULL in search_binary_handler.
    
    Link: https://lkml.kernel.org/r/87sgfwyd84.fsf_-_@x220.int.ebiederm.orgAcked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    bc2bf338
binfmt_loader.c 971 Bytes