Skip to content
  • Allison Karlitskaya's avatar
    gutils: stop g_get_home_dir() from reading passwd · cfafad5a
    Allison Karlitskaya authored
    In the case that the "HOME" environment variable is set (as it is under
    normal circumstances), we don't really need to be opening /etc/passwd.
    
    For historical reasons (ie: how we used to ignore $HOME) and due to the
    grouping of many unrelated things together (reading username, hostname,
    home directory, tmpdir, etc.) into one function we were still opening
    /etc/passwd in g_get_home_dir(), even if $HOME was set.
    
    Since earlier commits removed code from it, all that remains in
    g_get_any_init_do() is the logic for dealing with $HOME and reading the
    password database.
    
    We now split the logic to deal with $HOME into g_get_home_dir().  With
    only the password database functionality remaining, g_get_any_init_do()
    is renamed to g_get_user_database_entry() and modified not to set global
    variables but rather return a struct.  If g_get_home_dir() cannot find
    $HOME, it falls back to calling g_get_user_database_entry() and using
    the home directory from there.
    
    Use of the 'g_utils_global' lock is further reduced by using
    g_once_init_enter() to protect the critical sections in each of
    g_get_user_database_entry() and g_get_home_dir().
    
    Finally, the g_get_user_name() and g_get_real_name() functions are
    modified to use the new regime.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=693204
    cfafad5a