• R
    overhaul __synccall and fix AS-safety and other issues in set*id · 78a8ef47
    Rich Felker 提交于
    multi-threaded set*id and setrlimit use the internal __synccall
    function to work around the kernel's wrongful treatment of these
    process properties as thread-local. the old implementation of
    __synccall failed to be AS-safe, despite POSIX requiring setuid and
    setgid to be AS-safe, and was not rigorous in assuring that all
    threads were caught. in a worst case, threads late in the process of
    exiting could retain permissions after setuid reported success, in
    which case attacks to regain dropped permissions may have been
    possible under the right conditions.
    
    the new implementation of __synccall depends on the presence of
    /proc/self/task and will fail if it can't be opened, but is able to
    determine that it has caught all threads, and does not use any locks
    except its own. it thereby achieves AS-safety simply by blocking
    signals to preclude re-entry in the same thread.
    
    with this commit, all known conformance and safety issues in set*id
    functions should be fixed.
    78a8ef47
pthread_create.c 7.5 KB