• Tom Lane's avatar
    Fix libpq's behavior when /etc/passwd isn't readable. · 080eabe2
    Tom Lane authored
    Some users run their applications in chroot environments that lack an
    /etc/passwd file.  This means that the current UID's user name and home
    directory are not obtainable.  libpq used to be all right with that,
    so long as the database role name to use was specified explicitly.
    But commit a4c8f143 broke such cases by
    causing any failure of pg_fe_getauthname() to be treated as a hard error.
    In any case it did little to advance its nominal goal of causing errors
    in pg_fe_getauthname() to be reported better.  So revert that and instead
    put some real error-reporting code in place.  This requires changes to the
    APIs of pg_fe_getauthname() and pqGetpwuid(), since the latter had
    departed from the POSIX-specified API of getpwuid_r() in a way that made
    it impossible to distinguish actual lookup errors from "no such user".
    
    To allow such failures to be reported, while not failing if the caller
    supplies a role name, add a second call of pg_fe_getauthname() in
    connectOptions2().  This is a tad ugly, and could perhaps be avoided with
    some refactoring of PQsetdbLogin(), but I'll leave that idea for later.
    (Note that the complained-of misbehavior only occurs in PQsetdbLogin,
    not when using the PQconnect functions, because in the latter we will
    never bother to call pg_fe_getauthname() if the user gives a role name.)
    
    In passing also clean up the Windows-side usage of GetUserName(): the
    recommended buffer size is 257 bytes, the passed buffer length should
    be the buffer size not buffer size less 1, and any error is reported
    by GetLastError() not errno.
    
    Per report from Christoph Berg.  Back-patch to 9.4 where the chroot
    failure case was introduced.  The generally poor reporting of errors
    here is of very long standing, of course, but given the lack of field
    complaints about it we won't risk changing these APIs further back
    (even though they're theoretically internal to libpq).
    080eabe2
fe-connect.c 143 KB