• Tom Lane's avatar
    Revert error-throwing wrappers for the printf family of functions. · 0c071936
    Tom Lane authored
    This reverts commit 16304a01, except
    for its changes in src/port/snprintf.c; as well as commit
    cac18a76 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
    0c071936
port.h 13.5 KB