postgresql/src/port
Tom Lane 080eabe2e8 Fix libpq's behavior when /etc/passwd isn't readable.
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 a4c8f14364 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).
2015-01-11 12:35:44 -05:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
chklocale.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
crypt.c Suppress dead, unportable src/port/crypt.c code. 2014-10-12 23:27:06 -04:00
dirent.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
dirmod.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
erand48.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
fls.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
fseeko.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
getaddrinfo.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
gethostname.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
getopt_long.c Add support for optional_argument to our own getopt_long() implementation. 2014-09-10 17:21:50 +02:00
getopt.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
getpeereid.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
getrusage.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
gettimeofday.c Windows: use GetSystemTimePreciseAsFileTime if available 2014-12-08 23:36:06 +09:00
inet_aton.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
inet_net_ntop.c Pgindent run before 9.1 beta2. 2011-06-09 14:32:50 -04:00
isinf.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
kill.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
Makefile Move username lookup functions from /port to /common 2014-01-10 18:03:28 -05:00
mkdtemp.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
noblock.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
open.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
path.c Fix libpq's behavior when /etc/passwd isn't readable. 2015-01-11 12:35:44 -05:00
pg_crc.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pgcheckdir.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pgmkdirp.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
pgsleep.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pgstrcasecmp.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pqsignal.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pthread-win32.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
qsort_arg.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
qsort.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
quotes.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
random.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
README Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
rint.c Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
snprintf.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
sprompt.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
srandom.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
strerror.c Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
strlcat.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
strlcpy.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
system.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
tar.c Don't include file type bits in tar archive's mode field. 2014-12-05 13:54:21 +02:00
thread.c Fix libpq's behavior when /etc/passwd isn't readable. 2015-01-11 12:35:44 -05:00
unsetenv.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
win32.ico Revert binary change in copyright year adjustment. 2012-01-01 19:40:13 -05:00
win32env.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
win32error.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
win32setlocale.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
win32ver.rc Update copyright for 2015 2015-01-06 11:43:47 -05:00

src/port/README

libpgport
=========

libpgport must have special behavior.  It supplies functions to both
libraries and applications.  However, there are two complexities:

1)  Libraries need to use object files that are compiled with exactly
the same flags as the library.  libpgport might not use the same flags,
so it is necessary to recompile the object files for individual
libraries.  This is done by removing -lpgport from the link line:

        # Need to recompile any libpgport object files
        LIBS := $(filter-out -lpgport, $(LIBS))

and adding infrastructure to recompile the object files:

        OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
                connect.o misc.o path.o exec.o \
                $(filter snprintf.o, $(LIBOBJS))

The problem is that there is no testing of which object files need to be
added, but missing functions usually show up when linking user
applications.

2) For applications, we use -lpgport before -lpq, so the static files
from libpgport are linked first.  This avoids having applications
dependent on symbols that are _used_ by libpq, but not intended to be
exported by libpq.  libpq's libpgport usage changes over time, so such a
dependency is a problem.  Win32, Linux, and Darwin use an export list to
control the symbols exported by libpq.