Skip to content
  • deuce's avatar
    Check the current real and effective IDs (user and group) before calling · 3fd75078
    deuce authored
    setre?id() since new systems apparently hang on that call when the IDs
    are already what you want.  Further, use a single mutex to protect both
    do_setuid() and do_seteuid().
    
    The symptoms:
    When you connect to the BBS, the user prompt would repeat quickly three
    times then drop carrier on you.  Nothing you entered ever showed up.
    --OR--
    You seem to connect to the BBS, but you never see any output.
    
    This was only easily reproduced when starting the system as a non-root
    user.
    
    This has been confirmed on FC3, FC4, and Debian etch.
    
    
    The cause:
    output_thread or input_thread called thread_up() which called do_seteuid()
    which hung in setregid().  Since do_seteuid() is holding a mutex at this
    point, when the other *put_thread calls thread_up(), it waits forever for
    the mutex.  If output_thread starts first, this results in getchr()
    returning ^C every time it's called since input_thread_running is false.
    
    
    Question for DigitalMan:
    Should output_thread/input_thread post a semaphore when they're up to prevent
    SMP systems from getting far enough into answer() to call IO stuff before the
    corresponding thread is running?  A timed semaphore wait in main.cpp then
    could be used (you wouldn't want to block forever in case this happens again).
    3fd75078