1. 08 May, 2017 6 commits
    • Noah Misch's avatar
      Match pg_user_mappings limits to information_schema.user_mapping_options. · 3eefc510
      Noah Misch authored
      Both views replace the umoptions field with NULL when the user does not
      meet qualifications to see it.  They used different qualifications, and
      pg_user_mappings documented qualifications did not match its implemented
      qualifications.  Make its documentation and implementation match those
      of user_mapping_options.  One might argue for stronger qualifications,
      but these have long, documented tenure.  pg_user_mappings has always
      exhibited this problem, so back-patch to 9.2 (all supported versions).
      
      Michael Paquier and Feike Steenbergen.  Reviewed by Jeff Janes.
      Reported by Andrew Wheelwright.
      
      Security: CVE-2017-7486
      3eefc510
    • Noah Misch's avatar
      Restore PGREQUIRESSL recognition in libpq. · 0170b10d
      Noah Misch authored
      Commit 65c3bf19 moved handling of the,
      already then, deprecated requiressl parameter into conninfo_storeval().
      The default PGREQUIRESSL environment variable was however lost in the
      change resulting in a potentially silent accept of a non-SSL connection
      even when set.  Its documentation remained.  Restore its implementation.
      Also amend the documentation to mark PGREQUIRESSL as deprecated for
      those not following the link to requiressl.  Back-patch to 9.3, where
      commit 65c3bf19 first appeared.
      
      Behavior has been more complex when the user provides both deprecated
      and non-deprecated settings.  Before commit 65c3bf19, libpq operated
      according to the first of these found:
      
        requiressl=1
        PGREQUIRESSL=1
        sslmode=*
        PGSSLMODE=*
      
      (Note requiressl=0 didn't override sslmode=*; it would only suppress
      PGREQUIRESSL=1 or a previous requiressl=1.  PGREQUIRESSL=0 had no effect
      whatsoever.)  Starting with commit 65c3bf19, libpq ignored PGREQUIRESSL,
      and order of precedence changed to this:
      
        last of requiressl=* or sslmode=*
        PGSSLMODE=*
      
      Starting now, adopt the following order of precedence:
      
        last of requiressl=* or sslmode=*
        PGSSLMODE=*
        PGREQUIRESSL=1
      
      This retains the 65c3bf19 behavior for connection strings that contain
      both requiressl=* and sslmode=*.  It retains the 65c3bf19 change that
      either connection string option overrides both environment variables.
      For the first time, PGSSLMODE has precedence over PGREQUIRESSL; this
      avoids reducing security of "PGREQUIRESSL=1 PGSSLMODE=verify-full"
      configurations originating under v9.3 and later.
      
      Daniel Gustafsson
      
      Security: CVE-2017-7485
      0170b10d
    • Bruce Momjian's avatar
      doc: add Simon Riggs to VACUUM VERBOSE PG 10 release note item · 74cadeaa
      Bruce Momjian authored
      Reported-by: Masahiko Sawada
      74cadeaa
    • Peter Eisentraut's avatar
      Add security checks to selectivity estimation functions · e2d4ef8d
      Peter Eisentraut authored
      Some selectivity estimation functions run user-supplied operators over
      data obtained from pg_statistic without security checks, which allows
      those operators to leak pg_statistic data without having privileges on
      the underlying tables.  Fix by checking that one of the following is
      satisfied: (1) the user has table or column privileges on the table
      underlying the pg_statistic data, or (2) the function implementing the
      user-supplied operator is leak-proof.  If neither is satisfied, planning
      will proceed as if there are no statistics available.
      
      At least one of these is satisfied in most cases in practice.  The only
      situations that are negatively impacted are user-defined or
      not-leak-proof operators on a security-barrier view.
      Reported-by: default avatarRobert Haas <robertmhaas@gmail.com>
      Author: Peter Eisentraut <peter_e@gmx.net>
      Author: Tom Lane <tgl@sss.pgh.pa.us>
      
      Security: CVE-2017-7484
      e2d4ef8d
    • Heikki Linnakangas's avatar
      Remove support for password_encryption='off' / 'plain'. · eb61136d
      Heikki Linnakangas authored
      Storing passwords in plaintext hasn't been a good idea for a very long
      time, if ever. Now seems like a good time to finally forbid it, since we're
      messing with this in PostgreSQL 10 anyway.
      
      Remove the CREATE/ALTER USER UNENCRYPTED PASSSWORD 'foo' syntax, since
      storing passwords unencrypted is no longer supported. ENCRYPTED PASSWORD
      'foo' is still accepted, but ENCRYPTED is now just a noise-word, it does
      the same as just PASSWORD 'foo'.
      
      Likewise, remove the --unencrypted option from createuser, but accept
      --encrypted as a no-op for backward compatibility. AFAICS, --encrypted was
      a no-op even before this patch, because createuser encrypted the password
      before sending it to the server even if --encrypted was not specified. It
      added the ENCRYPTED keyword to the SQL command, but since the password was
      already in encrypted form, it didn't make any difference. The documentation
      was not clear on whether that was intended or not, but it's moot now.
      
      Also, while password_encryption='on' is still accepted as an alias for
      'md5', it is now marked as hidden, so that it is not listed as an accepted
      value in error hints, for example. That's not directly related to removing
      'plain', but it seems better this way.
      
      Reviewed by Michael Paquier
      
      Discussion: https://www.postgresql.org/message-id/16e9b768-fd78-0b12-cfc1-7b6b7f238fde@iki.fi
      eb61136d
    • Simon Riggs's avatar
      Remove poorly worded and duplicated comment · 1f30295e
      Simon Riggs authored
      Move line of code to avoid need for duplicated comment
      
      Brought to attention by Masahiko Sawada
      1f30295e
  2. 07 May, 2017 10 commits
  3. 06 May, 2017 3 commits
  4. 05 May, 2017 11 commits
    • Tom Lane's avatar
      First-draft release notes for 9.6.3. · 54dbd4dc
      Tom Lane authored
      As usual, the release notes for other branches will be made by cutting
      these down, but put them up for community review first.  Note there
      are some entries that really only apply to pre-9.6 branches.
      54dbd4dc
    • Tom Lane's avatar
      Suppress compiler warning about unportable pointer value. · b3a47cdf
      Tom Lane authored
      Setting a pointer value to "0xdeadbeef" draws a warning from some
      compilers, and for good reason.  Be less cute and just set it to NULL.
      
      In passing make some other cosmetic adjustments nearby.
      
      Discussion: https://postgr.es/m/CAJrrPGdW3EkU-CRobvVKYf3fJuBdgWyuGeAbNzAQ4yBh+bfb_Q@mail.gmail.com
      b3a47cdf
    • Alvaro Herrera's avatar
      Allow MSVC to build with Tcl 8.6. · 14722c69
      Alvaro Herrera authored
      Commit eaba54c2 added support for Tcl 8.6 for configure-supported
      platforms after verifying that pltcl works without further changes, but
      the MSVC tooling wasn't updated accordingly.  Update MSVC to match,
      restructuring the code to avoid duplicating the logic for every Tcl
      version supported.
      
      Backpatch to all live branches, like eaba54c2.  In 9.4 and previous,
      change the patch to use backslashes rather than forward, as in the rest
      of the file.
      
      Reported by Paresh More, who also tested the patch I provided.
      Discussion: https://postgr.es/m/CAAgiCNGVw3ssBtSi3ZNstrz5k00ax=UV+_ZEHUeW_LMSGL2sew@mail.gmail.com
      14722c69
    • Peter Eisentraut's avatar
      Prevent panic during shutdown checkpoint · 086221cf
      Peter Eisentraut authored
      When the checkpointer writes the shutdown checkpoint, it checks
      afterwards whether any WAL has been written since it started and throws
      a PANIC if so.  At that point, only walsenders are still active, so one
      might think this could not happen, but walsenders can also generate WAL,
      for instance in BASE_BACKUP and certain variants of
      CREATE_REPLICATION_SLOT.  So they can trigger this panic if such a
      command is run while the shutdown checkpoint is being written.
      
      To fix this, divide the walsender shutdown into two phases.  First, the
      postmaster sends a SIGUSR2 signal to all walsenders.  The walsenders
      then put themselves into the "stopping" state.  In this state, they
      reject any new commands.  (For simplicity, we reject all new commands,
      so that in the future we do not have to track meticulously which
      commands might generate WAL.)  The checkpointer waits for all walsenders
      to reach this state before proceeding with the shutdown checkpoint.
      After the shutdown checkpoint is done, the postmaster sends
      SIGINT (previously unused) to the walsenders.  This triggers the
      existing shutdown behavior of sending out the shutdown checkpoint record
      and then terminating.
      
      Author: Michael Paquier <michael.paquier@gmail.com>
      Reported-by: default avatarFujii Masao <masao.fujii@gmail.com>
      086221cf
    • Magnus Hagander's avatar
      Fix wording in pg_upgrade docs · 499ae5f5
      Magnus Hagander authored
      Author: Daniel Gustafsson
      499ae5f5
    • Magnus Hagander's avatar
      Build pgoutput.dll in MSVC build · 28d1c8cc
      Magnus Hagander authored
      Without this, logical replication obviously does not work on Windows
      
      MauMau, with clean.bet additions from me per note from Michael Paquier
      28d1c8cc
    • Heikki Linnakangas's avatar
      Make SCRAM salts and nonces longer. · 0557a5dc
      Heikki Linnakangas authored
      The salt is stored base64-encoded. With the old 10 bytes raw length, it was
      always padded to 16 bytes after encoding. We might as well use 12 raw bytes
      for the salt, and it's still encoded into 16 bytes.
      
      Similarly for the random nonces, use a raw length that's divisible by 3, so
      that there's no padding after base64 encoding. Make the nonces longer while
      we're at it. 10 bytes was probably enough to prevent replay attacks, but
      there's no reason to be skimpy here.
      
      Per suggestion from Álvaro Hernández Tortosa.
      
      Discussion: https://www.postgresql.org/message-id/df8c6e27-4d8e-5281-96e5-131a4e638fc8@8kdata.com
      0557a5dc
    • Heikki Linnakangas's avatar
      Misc cleanup of SCRAM code. · e6e9c4da
      Heikki Linnakangas authored
      * Remove is_scram_verifier() function. It was unused.
      * Fix sanitize_char() function, used in error messages on protocol
        violations, to print bytes >= 0x7F correctly.
      * Change spelling of scram_MockSalt() function to be more consistent with
        the surroundings.
      * Change a few more references to "server proof" to "server signature" that
        I missed in commit d981074c.
      e6e9c4da
    • Heikki Linnakangas's avatar
      Don't use SCRAM-specific "e=invalid-proof" on invalid password. · 344a1130
      Heikki Linnakangas authored
      Instead, send the same FATAL message as with other password-based
      authentication mechanisms. This gives a more user-friendly message:
      
      psql: FATAL:  password authentication failed for user "test"
      
      instead of:
      
      psql: error received from server in SASL exchange: invalid-proof
      
      Even before this patch, the server sent that FATAL message, after the
      SCRAM-specific "e=invalid-proof" message. But libpq would stop at the
      SCRAM error message, and not process the ErrorResponse that would come
      after that. We could've taught libpq to check for an ErrorResponse after
      failed authentication, but it's simpler to modify the server to send only
      the ErrorResponse. The SCRAM specification allows for aborting the
      authentication at any point, using an application-defined error mechanism,
      like PostgreSQL's ErrorResponse. Using the e=invalid-proof message is
      optional.
      
      Reported by Jeff Janes.
      
      Discussion: https://www.postgresql.org/message-id/CAMkU%3D1w3jQ53M1OeNfN8Cxd9O%2BA_9VONJivTbYoYRRdRsLT6vA@mail.gmail.com
      344a1130
    • Stephen Frost's avatar
      Change the way pg_dump retrieves partitioning info · 44c52881
      Stephen Frost authored
      This gets rid of the code that issued separate queries to retrieve the
      partitioning parent-child relationship, parent partition key, and child
      partition bound information.  With this patch, the information is
      retrieved instead using the queries issued from getTables() and
      getInherits(), which is both more efficient than the previous approach
      and doesn't require any new code.
      
      Since the partitioning parent-child relationship is now retrieved with
      the same old code that handles inheritance, partition attributes receive
      a proper flagInhAttrs() treatment (that it didn't receive before), which
      is needed so that the inherited NOT NULL constraints are not emitted if
      we already emitted it for the parent.
      
      Also, fix a bug in pg_dump's --binary-upgrade code, which caused pg_dump
      to emit invalid command to attach a partition to its parent.
      
      Author: Amit Langote, with some additional changes by me.
      44c52881
    • Bruce Momjian's avatar
      doc: update PG 10 release notes · 5469e44f
      Bruce Momjian authored
      Mention vacuum verbose includes oldest xmin, BRIN index usage
      estimation, and multi-column statistics.
      
      Reported-by: Masahiko Sawada, Alvaro Herrera
      5469e44f
  5. 04 May, 2017 5 commits
    • Bruce Momjian's avatar
      doc: PG 10 release note updates for psql, GiST, and markup · 4f45beba
      Bruce Momjian authored
      Reported-by: Andrew Borodin, Fabien COELHO, Dagfinn Ilmari Mannsaker
      4f45beba
    • Alvaro Herrera's avatar
      Credit Claudio as main author of feature · c22b59ed
      Alvaro Herrera authored
      c22b59ed
    • Tom Lane's avatar
      Fix pfree-of-already-freed-tuple when rescanning a GiST index-only scan. · 3f074845
      Tom Lane authored
      GiST's getNextNearest() function attempts to pfree the previously-returned
      tuple if any (that is, scan->xs_hitup in HEAD, or scan->xs_itup in older
      branches).  However, if we are rescanning a plan node after ending a
      previous scan early, those tuple pointers could be pointing to garbage,
      because they would be pointing into the scan's pageDataCxt or queueCxt
      which has been reset.  In a debug build this reliably results in a crash,
      although I think it might sometimes accidentally fail to fail in
      production builds.
      
      To fix, clear the pointer field anyplace we reset a context it might
      be pointing into.  This may be overkill --- I think probably only the
      queueCxt case is involved in this bug, so that resetting in gistrescan()
      would be sufficient --- but dangling pointers are generally bad news,
      so let's avoid them.
      
      Another plausible answer might be to just not bother with the pfree in
      getNextNearest().  The reconstructed tuples would go away anyway in the
      context resets, and I'm far from convinced that freeing them a bit earlier
      really saves anything meaningful.  I'll stick with the original logic in
      this patch, but if we find more problems in the same area we should
      consider that approach.
      
      Per bug #14641 from Denis Smirnov.  Back-patch to 9.5 where this
      logic was introduced.
      
      Discussion: https://postgr.es/m/20170504072034.24366.57688@wrigleys.postgresql.org
      3f074845
    • Heikki Linnakangas's avatar
      Fix PQencryptPasswordConn to work with older server versions. · 20bf7b2b
      Heikki Linnakangas authored
      password_encryption was a boolean before version 10, so cope with "on" and
      "off".
      
      Also, change the behavior with "plain", to treat it the same as "md5".
      We're discussing removing the password_encryption='plain' option from the
      server altogether, which will make this the only reasonable choice, but
      even if we kept it, it seems best to never send the password in cleartext.
      20bf7b2b
    • Peter Eisentraut's avatar
      Fix cursor_to_xml in tableforest false mode · 0de791ed
      Peter Eisentraut authored
      It only produced <row> elements but no wrapping <table> element.
      
      By contrast, cursor_to_xmlschema produced a schema that is now correct
      but did not previously match the XML data produced by cursor_to_xml.
      
      In passing, also fix a minor misunderstanding about moving cursors in
      the tests related to this.
      
      Reported-by: filip@jirsak.org
      Based-on-patch-by: default avatarThomas Munro <thomas.munro@enterprisedb.com>
      0de791ed
  6. 03 May, 2017 5 commits
    • Tom Lane's avatar
      Remove useless and rather expensive stanza in matview regression test. · 4dd41043
      Tom Lane authored
      This removes a test case added by commit b69ec7cc, which was intended
      to exercise a corner case involving the rule used at that time that
      materialized views were unpopulated iff they had physical size zero.
      We got rid of that rule very shortly later, in commit 1d6c72a5, but
      kept the test case.  However, because the case now asks what VACUUM
      will do to a zero-sized physical file, it would be pretty surprising
      if the answer were ever anything but "nothing" ... and if things were
      indeed that broken, surely we'd find it out from other tests.  Since
      the test involves a table that's fairly large by regression-test
      standards (100K rows), it's quite slow to run.  Dropping it should
      save some buildfarm cycles, so let's do that.
      
      Discussion: https://postgr.es/m/32386.1493831320@sss.pgh.pa.us
      4dd41043
    • Alvaro Herrera's avatar
      Add pg_dump tests for CREATE STATISTICS · a93077ef
      Alvaro Herrera authored
      CREATE STATISTICS pg_dump support code was not covered at all by
      previous tests.
      
      Discussion: https://postgr.es/m/20170503172746.rwftidszir67sgk7@alvherre.pgsql
      a93077ef
    • Alvaro Herrera's avatar
      pg_dump/t/002: append terminating semicolon to SQL commands · 698923d6
      Alvaro Herrera authored
      It's easy to overlook the need for one, and its lack is annoying for the
      next developer wanting to create a new test.  Rather than expect every
      individual command to add the semicolon, just append one automatically.
      
      Discussion: http://postgr.es/m/20170503172746.rwftidszir67sgk7@alvherre.pgsql
      698923d6
    • Heikki Linnakangas's avatar
      Add PQencryptPasswordConn function to libpq, use it in psql and createuser. · 8f8b9be5
      Heikki Linnakangas authored
      The new function supports creating SCRAM verifiers, in addition to md5
      hashes. The algorithm is chosen based on password_encryption, by default.
      
      This fixes the issue reported by Jeff Janes, that there was previously
      no way to create a SCRAM verifier with "\password".
      
      Michael Paquier and me
      
      Discussion: https://www.postgresql.org/message-id/CAMkU%3D1wfBgFPbfAMYZQE78p%3DVhZX7nN86aWkp0QcCp%3D%2BKxZ%3Dbg%40mail.gmail.com
      8f8b9be5
    • Tom Lane's avatar
      Improve performance of timezone loading, especially pg_timezone_names view. · af2c5aa8
      Tom Lane authored
      tzparse() would attempt to load the "posixrules" timezone database file on
      each call.  That might seem like it would only be an issue when selecting a
      POSIX-style zone name rather than a zone defined in the timezone database,
      but it turns out that each zone definition file contains a POSIX-style zone
      string and tzload() will call tzparse() to parse that.  Thus, when scanning
      the whole timezone file tree as we do in the pg_timezone_names view,
      "posixrules" was read repetitively for each zone definition file.  Fix
      that by caching the file on first use within any given process.  (We cache
      other zone definitions for the life of the process, so there seems little
      reason not to cache this one as well.)  This probably won't help much in
      processes that never run pg_timezone_names, but even one additional SET
      of the timezone GUC would come out ahead.
      
      An even worse problem for pg_timezone_names is that pg_open_tzfile()
      has an inefficient way of identifying the canonical case of a zone name:
      it basically re-descends the directory tree to the zone file.  That's not
      awful for an individual "SET timezone" operation, but it's pretty horrid
      when we're inspecting every zone in the database.  And it's pointless too
      because we already know the canonical spelling, having just read it from
      the filesystem.  Fix by teaching pg_open_tzfile() to avoid the directory
      search if it's not asked for the canonical name, and backfilling the
      proper result in pg_tzenumerate_next().
      
      In combination these changes seem to make the pg_timezone_names view
      about 3x faster to read, for me.  Since a scan of pg_timezone_names
      has up to now been one of the slowest queries in the regression tests,
      this should help some little bit for buildfarm cycle times.
      
      Back-patch to all supported branches, not so much because it's likely
      that users will care much about the view's performance as because
      tracking changes in the upstream IANA timezone code is really painful
      if we don't keep all the branches in sync.
      
      Discussion: https://postgr.es/m/27962.1493671706@sss.pgh.pa.us
      af2c5aa8