postgresql/src/port
Tom Lane 0c071936e9 Revert error-throwing wrappers for the printf family of functions.
This reverts commit 16304a0134, except
for its changes in src/port/snprintf.c; as well as commit
cac18a76bb which is no longer needed.

Fujii Masao reported that the previous commit caused failures in psql on
OS X, since if one exits the pager program early while viewing a query
result, psql sees an EPIPE error from fprintf --- and the wrapper function
thought that was reason to panic.  (It's a bit surprising that the same
does not happen on Linux.)  Further discussion among the security list
concluded that the risk of other such failures was far too great, and
that the one-size-fits-all approach to error handling embodied in the
previous patch is unlikely to be workable.

This leaves us again exposed to the possibility of the type of failure
envisioned in CVE-2015-3166.  However, that failure mode is strictly
hypothetical at this point: there is no concrete reason to believe that
an attacker could trigger information disclosure through the supposed
mechanism.  In the first place, the attack surface is fairly limited,
since so much of what the backend does with format strings goes through
stringinfo.c or psprintf(), and those already had adequate defenses.
In the second place, even granting that an unprivileged attacker could
control the occurrence of ENOMEM with some precision, it's a stretch to
believe that he could induce it just where the target buffer contains some
valuable information.  So we concluded that the risk of non-hypothetical
problems induced by the patch greatly outweighs the security risks.
We will therefore revert, and instead undertake closer analysis to
identify specific calls that may need hardening, rather than attempt a
universal solution.

We have kept the portion of the previous patch that improved snprintf.c's
handling of errors when it calls the platform's sprintf().  That seems to
be an unalloyed improvement.

Security: CVE-2015-3166
2015-05-19 18:19:38 -04:00
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
Makefile Revert error-throwing wrappers for the printf family of functions. 2015-05-19 18:19:38 -04:00
README Remove cvs keywords from all files. 2010-09-20 22:08:53 +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 Use FLEXIBLE_ARRAY_MEMBER in Windows-specific code. 2015-02-21 16:49:35 -05:00
erand48.c TABLESAMPLE, SQL Standard and extensible 2015-05-15 14:37:10 -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
getopt.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
getopt_long.c Add support for optional_argument to our own getopt_long() implementation. 2014-09-10 17:21:50 +02: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 Try to fix busted gettimeofday() code. 2015-02-21 17:15:13 -05: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
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_crc32c_choose.c Use Intel SSE 4.2 CRC instructions where available. 2015-04-14 17:05:03 +03:00
pg_crc32c_sb8.c Reorganize our CRC source files again. 2015-04-14 17:03:42 +03:00
pg_crc32c_sse42.c Optimize pg_comp_crc32c_sse42 routine slightly, and also use it on x86. 2015-04-14 23:58:16 +03:00
pgcheckdir.c Improve pg_check_dir code and comments. 2015-02-17 10:19:30 -05:00
pgmkdirp.c Fix various typos and grammar errors in comments. 2015-04-26 18:42:31 +02: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.c pgindent run for 9.4 2014-05-06 12:12:18 -04:00
qsort_arg.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
rint.c Upgrade src/port/rint.c to be POSIX-compliant. 2015-03-25 15:54:18 -04:00
snprintf.c Revert error-throwing wrappers for the printf family of functions. 2015-05-19 18:19:38 -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 Error when creating names too long for tar format 2015-02-24 13:41:07 -05:00
thread.c Remove configure test for nonstandard variants of getpwuid_r(). 2015-01-11 12:52:37 -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 Another attempt at fixing Windows Norwegian locale. 2015-01-16 13:28:19 +02:00
win32ver.rc Update copyright for 2015 2015-01-06 11:43:47 -05:00

README

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.