Skip to content
Snippets Groups Projects
  1. Mar 28, 2016
  2. Feb 08, 2016
  3. Nov 22, 2015
    • Tom Lane's avatar
      Adopt the GNU convention for handling tar-archive members exceeding 8GB. · b054ca03
      Tom Lane authored
      The POSIX standard for tar headers requires archive member sizes to be
      printed in octal with at most 11 digits, limiting the representable file
      size to 8GB.  However, GNU tar and apparently most other modern tars
      support a convention in which oversized values can be stored in base-256,
      allowing any practical file to be a tar member.  Adopt this convention
      to remove two limitations:
      * pg_dump with -Ft output format failed if the contents of any one table
      exceeded 8GB.
      * pg_basebackup failed if the data directory contained any file exceeding
      8GB.  (This would be a fatal problem for installations configured with a
      table segment size of 8GB or more, and it has also been seen to fail when
      large core dump files exist in the data directory.)
      
      File sizes under 8GB are still printed in octal, so that no compatibility
      issues are created except in cases that would have failed entirely before.
      
      In addition, this patch fixes several bugs in the same area:
      
      * In 9.3 and later, we'd defined tarCreateHeader's file-size argument as
      size_t, which meant that on 32-bit machines it would write a corrupt tar
      header for file sizes between 4GB and 8GB, even though no error was raised.
      This broke both "pg_dump -Ft" and pg_basebackup for such cases.
      
      * pg_restore from a tar archive would fail on tables of size between 4GB
      and 8GB, on machines where either "size_t" or "unsigned long" is 32 bits.
      This happened even with an archive file not affected by the previous bug.
      
      * pg_basebackup would fail if there were files of size between 4GB and 8GB,
      even on 64-bit machines.
      
      * In 9.3 and later, "pg_basebackup -Ft" failed entirely, for any file size,
      on 64-bit big-endian machines.
      
      In view of these potential data-loss bugs, back-patch to all supported
      branches, even though removal of the documented 8GB limit might otherwise
      be considered a new feature rather than a bug fix.
      b054ca03
  4. Oct 05, 2015
  5. Jul 17, 2015
    • Tom Lane's avatar
      Fix a low-probability crash in our qsort implementation. · 15ca2b6c
      Tom Lane authored
      It's standard for quicksort implementations, after having partitioned the
      input into two subgroups, to recurse to process the smaller partition and
      then handle the larger partition by iterating.  This method guarantees
      that no more than log2(N) levels of recursion can be needed.  However,
      Bentley and McIlroy argued that checking to see which partition is smaller
      isn't worth the cycles, and so their code doesn't do that but just always
      recurses on the left partition.  In most cases that's fine; but with
      worst-case input we might need O(N) levels of recursion, and that means
      that qsort could be driven to stack overflow.  Such an overflow seems to
      be the only explanation for today's report from Yiqing Jin of a SIGSEGV
      in med3_tuple while creating an index of a couple billion entries with a
      very large maintenance_work_mem setting.  Therefore, let's spend the few
      additional cycles and lines of code needed to choose the smaller partition
      for recursion.
      
      Also, fix up the qsort code so that it properly uses size_t not int for
      some intermediate values representing numbers of items.  This would only
      be a live risk when sorting more than INT_MAX bytes (in qsort/qsort_arg)
      or tuples (in qsort_tuple), which I believe would never happen with any
      caller in the current core code --- but perhaps it could happen with
      call sites in third-party modules?  In any case, this is trouble waiting
      to happen, and the corrected code is probably if anything shorter and
      faster than before, since it removes sign-extension steps that had to
      happen when converting between int and size_t.
      
      In passing, move a couple of CHECK_FOR_INTERRUPTS() calls so that it's
      not necessary to preserve the value of "r" across them, and prettify
      the output of gen_qsort_tuple.pl a little.
      
      Back-patch to all supported branches.  The odds of hitting this issue
      are probably higher in 9.4 and up than before, due to the new ability
      to allocate sort workspaces exceeding 1GB, but there's no good reason
      to believe that it's impossible to crash older branches this way.
      15ca2b6c
  6. Jun 09, 2015
  7. Jun 01, 2015
  8. May 20, 2015
    • Tom Lane's avatar
      Revert error-throwing wrappers for the printf family of functions. · 221f7a94
      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
      221f7a94
  9. May 18, 2015
    • Tom Lane's avatar
      Stamp 9.2.11. · 520fecfa
      Tom Lane authored
      520fecfa
    • Noah Misch's avatar
      Add error-throwing wrappers for the printf family of functions. · 82b7393e
      Noah Misch authored
      All known standard library implementations of these functions can fail
      with ENOMEM.  A caller neglecting to check for failure would experience
      missing output, information exposure, or a crash.  Check return values
      within wrappers and code, currently just snprintf.c, that bypasses the
      wrappers.  The wrappers do not return after an error, so their callers
      need not check.  Back-patch to 9.0 (all supported versions).
      
      Popular free software standard library implementations do take pains to
      bypass malloc() in simple cases, but they risk ENOMEM for floating point
      numbers, positional arguments, large field widths, and large precisions.
      No specification demands such caution, so this commit regards every call
      to a printf family function as a potential threat.
      
      Injecting the wrappers implicitly is a compromise between patch scope
      and design goals.  I would prefer to edit each call site to name a
      wrapper explicitly.  libpq and the ECPG libraries would, ideally, convey
      errors to the caller rather than abort().  All that would be painfully
      invasive for a back-patched security fix, hence this compromise.
      
      Security: CVE-2015-3166
      82b7393e
    • Noah Misch's avatar
      Permit use of vsprintf() in PostgreSQL code. · 1e6652ae
      Noah Misch authored
      The next commit needs it.  Back-patch to 9.0 (all supported versions).
      1e6652ae
  10. Mar 01, 2015
    • Noah Misch's avatar
      Unlink static libraries before rebuilding them. · c3b0baf9
      Noah Misch authored
      When the library already exists in the build directory, "ar" preserves
      members not named on its command line.  This mattered when, for example,
      a "configure" rerun dropped a file from $(LIBOBJS).  libpgport carried
      the obsolete member until "make clean".  Back-patch to 9.0 (all
      supported versions).
      c3b0baf9
  11. Feb 17, 2015
    • Robert Haas's avatar
      Improve pg_check_dir's handling of closedir() failures. · 319406c2
      Robert Haas authored
      Avoid losing errno if readdir() fails and closedir() works.  This also
      avoids leaking the directory handle when readdir() fails.  Commit
      6f03927f introduced logic to better
      handle readdir() and closedir() failures, bu it missed these cases.
      
      Extracted from a larger patch by Marco Nenciarini.
      319406c2
  12. Feb 04, 2015
  13. Feb 02, 2015
  14. Jan 16, 2015
    • Heikki Linnakangas's avatar
      Another attempt at fixing Windows Norwegian locale. · 6bf343c6
      Heikki Linnakangas authored
      Previous fix mapped "Norwegian (Bokmål)" locale, which contains a non-ASCII
      character, to the pure ASCII alias "norwegian-bokmal". However, it turns
      out that more recent versions of the CRT library, in particular MSVCR110
      (Visual Studio 2012), changed the behaviour of setlocale() so that if
      you pass "norwegian-bokmal" to setlocale, it returns "Norwegian_Norway".
      
      That meant trouble, when setlocale(..., NULL) first returned
      "Norwegian (Bokmål)_Norway", which we mapped to "norwegian-bokmal_Norway",
      but another call to setlocale(..., "norwegian-bokmal_Norway") returned
      "Norwegian_Norway". That caused PostgreSQL to think that they are different
      locales, and therefore not compatible. That caused initdb to fail at
      CREATE DATABASE.
      
      Older CRT versions seem to accept "Norwegian_Norway" too, so change the
      mapping to return "Norwegian_Norway" instead of "norwegian-bokmal".
      
      Backpatch to 9.2 like the previous attempt. We haven't made a release that
      includes the previous fix yet, so we don't need to worry about changing the
      locale of existing clusters from "norwegian-bokmal" to "Norwegian_Norway".
      (Doing any mapping like this at all requires changing the locale of
      existing databases; the release notes need to include instructions for
      that).
      6bf343c6
  15. Jan 08, 2015
    • Noah Misch's avatar
      On Darwin, detect and report a multithreaded postmaster. · 5ca4e444
      Noah Misch authored
      Darwin --enable-nls builds use a substitute setlocale() that may start a
      thread.  Buildfarm member orangutan experienced BackendList corruption
      on account of different postmaster threads executing signal handlers
      simultaneously.  Furthermore, a multithreaded postmaster risks undefined
      behavior from sigprocmask() and fork().  Emit LOG messages about the
      problem and its workaround.  Back-patch to 9.0 (all supported versions).
      5ca4e444
  16. Nov 03, 2014
  17. Oct 24, 2014
    • Heikki Linnakangas's avatar
      Work around Windows locale name with non-ASCII character. · d440c4b5
      Heikki Linnakangas authored
      Windows has one a locale whose name contains a non-ASCII character:
      "Norwegian (Bokmål)" (that's an 'a' with a ring on top). That causes
      trouble; when passing it setlocale(), it's not clear what encoding the
      argument should be in. Another problem is that the locale name is stored in
      pg_database catalog table, and the encoding used there depends on what
      server encoding happens to be in use when the database is created. For
      example, if you issue the CREATE DATABASE when connected to a UTF-8
      database, the locale name is stored in pg_database in UTF-8. As long as all
      locale names are pure ASCII, that's not a problem.
      
      To work around that, map the troublesome locale name to a pure-ASCII alias
      of the same locale, "norwegian-bokmal".
      
      Now, this doesn't change the existing values that are already in
      pg_database and in postgresql.conf. Old clusters will need to be fixed
      manually. Instructions for that need to be put in the release notes.
      
      This fixes bug #11431 reported by Alon Siman-Tov. Backpatch to 9.2;
      backpatching further would require more work than seems worth it.
      d440c4b5
  18. Oct 13, 2014
    • Noah Misch's avatar
      Suppress dead, unportable src/port/crypt.c code. · 905a8f47
      Noah Misch authored
      This file used __int64, which is specific to native Windows, rather than
      int64.  Suppress the long-unused union field of this type.  Noticed on
      Cygwin x86_64 with -lcrypt not installed.  Back-patch to 9.0 (all
      supported versions).
      905a8f47
  19. Jul 23, 2014
  20. Jul 21, 2014
  21. Jun 14, 2014
    • Noah Misch's avatar
      Add mkdtemp() to libpgport. · a919937f
      Noah Misch authored
      This function is pervasive on free software operating systems; import
      NetBSD's implementation.  Back-patch to 8.4, like the commit that will
      harness it.
      a919937f
  22. May 06, 2014
    • Bruce Momjian's avatar
      Remove tabs after spaces in C comments · 0b44914c
      Bruce Momjian authored
      This was not changed in HEAD, but will be done later as part of a
      pgindent run.  Future pgindent runs will also do this.
      
      Report by Tom Lane
      
      Backpatch through all supported branches, but not HEAD
      0b44914c
  23. Apr 02, 2014
    • Tom Lane's avatar
      Fix assorted issues in client host name lookup. · 029decfe
      Tom Lane authored
      The code for matching clients to pg_hba.conf lines that specify host names
      (instead of IP address ranges) failed to complain if reverse DNS lookup
      failed; instead it silently didn't match, so that you might end up getting
      a surprising "no pg_hba.conf entry for ..." error, as seen in bug #9518
      from Mike Blackwell.  Since we don't want to make this a fatal error in
      situations where pg_hba.conf contains a mixture of host names and IP
      addresses (clients matching one of the numeric entries should not have to
      have rDNS data), remember the lookup failure and mention it as DETAIL if
      we get to "no pg_hba.conf entry".  Apply the same approach to forward-DNS
      lookup failures, too, rather than treating them as immediate hard errors.
      
      Along the way, fix a couple of bugs that prevented us from detecting an
      rDNS lookup error reliably, and make sure that we make only one rDNS lookup
      attempt; formerly, if the lookup attempt failed, the code would try again
      for each host name entry in pg_hba.conf.  Since more or less the whole
      point of this design is to ensure there's only one lookup attempt not one
      per entry, the latter point represents a performance bug that seems
      sufficient justification for back-patching.
      
      Also, adjust src/port/getaddrinfo.c so that it plays as well as it can
      with this code.  Which is not all that well, since it does not have actual
      support for rDNS lookup, but at least it should return the expected (and
      required by spec) error codes so that the main code correctly perceives the
      lack of functionality as a lookup failure.  It's unlikely that PG is still
      being used in production on any machines that require our getaddrinfo.c,
      so I'm not excited about working harder than this.
      
      To keep the code in the various branches similar, this includes
      back-patching commits c424d0d1 and
      1997f34d into 9.2 and earlier.
      
      Back-patch to 9.1 where the facility for hostnames in pg_hba.conf was
      introduced.
      029decfe
  24. Mar 21, 2014
  25. Mar 17, 2014
  26. Feb 17, 2014
    • Tom Lane's avatar
      Stamp 9.2.7. · 6237fadc
      Tom Lane authored
    • Tom Lane's avatar
      Prevent potential overruns of fixed-size buffers. · 655b665f
      Tom Lane authored
      Coverity identified a number of places in which it couldn't prove that a
      string being copied into a fixed-size buffer would fit.  We believe that
      most, perhaps all of these are in fact safe, or are copying data that is
      coming from a trusted source so that any overrun is not really a security
      issue.  Nonetheless it seems prudent to forestall any risk by using
      strlcpy() and similar functions.
      
      Fixes by Peter Eisentraut and Jozef Mlich based on Coverity reports.
      
      In addition, fix a potential null-pointer-dereference crash in
      contrib/chkpass.  The crypt(3) function is defined to return NULL on
      failure, but chkpass.c didn't check for that before using the result.
      The main practical case in which this could be an issue is if libc is
      configured to refuse to execute unapproved hashing algorithms (e.g.,
      "FIPS mode").  This ideally should've been a separate commit, but
      since it touches code adjacent to one of the buffer overrun changes,
      I included it in this commit to avoid last-minute merge issues.
      This issue was reported by Honza Horak.
      
      Security: CVE-2014-0065 for buffer overruns, CVE-2014-0066 for crypt()
      655b665f
  27. Dec 15, 2013
    • Tatsuo Ishii's avatar
      Add "SHIFT_JIS" as an accepted encoding name for locale checking. · 0c07ef1a
      Tatsuo Ishii authored
      When locale is "ja_JP.SJIS", nl_langinfo(CODESET) returns "SHIFT_JIS"
      on some platforms, at least on RedHat Linux. So the encoding/locale
      match table (encoding_match_list) needs the entry. Otherwise client
      encoding is set to SQL_ASCII.
      
      Back patch to all supported branches.
      0c07ef1a
  28. Dec 02, 2013
  29. Nov 24, 2013
    • Tom Lane's avatar
      Ensure _dosmaperr() actually sets errno correctly. · e86f2a05
      Tom Lane authored
      If logging is enabled, either ereport() or fprintf() might stomp on errno
      internally, causing this function to return the wrong result.  That might
      only end in a misleading error report, but in any code that's examining
      errno to decide what to do next, the consequences could be far graver.
      
      This has been broken since the very first version of this file in 2006
      ... it's a bit astonishing that we didn't identify this long ago.
      
      Reported by Amit Kapila, though this isn't his proposed fix.
      e86f2a05
  30. Oct 08, 2013
  31. Apr 01, 2013
  32. Feb 06, 2013
  33. Feb 04, 2013
  34. Jan 24, 2013
    • Andrew Dunstan's avatar
      Use correct output device for Windows prompts. · 6c77ce32
      Andrew Dunstan authored
      This ensures that mapping of non-ascii prompts
      to the correct code page occurs.
      
      Bug report and original patch from Alexander Law,
      reviewed and reworked by Noah Misch.
      
      Backpatch to all live branches.
      6c77ce32
  35. Dec 03, 2012
  36. Oct 02, 2012
    • Tom Lane's avatar
      Work around unportable behavior of malloc(0) and realloc(NULL, 0). · 689d9930
      Tom Lane authored
      On some platforms these functions return NULL, rather than the more common
      practice of returning a pointer to a zero-sized block of memory.  Hack our
      various wrapper functions to hide the difference by substituting a size
      request of 1.  This is probably not so important for the callers, who
      should never touch the block anyway if they asked for size 0 --- but it's
      important for the wrapper functions themselves, which mistakenly treated
      the NULL result as an out-of-memory failure.  This broke at least pg_dump
      for the case of no user-defined aggregates, as per report from
      Matthew Carrington.
      
      Back-patch to 9.2 to fix the pg_dump issue.  Given the lack of previous
      complaints, it seems likely that there is no live bug in previous releases,
      even though some of these functions were in place before that.
      689d9930
Loading