Skip to content
Snippets Groups Projects
  1. Apr 16, 2016
  2. Apr 15, 2016
    • Tom Lane's avatar
      Sync 9.2 and 9.3 versions of barrier.h with 9.4's version. · d7dbc882
      Tom Lane authored
      We weren't particularly maintaining barrier.h before 9.4, because nothing
      was using it in those branches.  Well, nothing until commit 37de8de9 got
      back-patched.  That broke 9.2 and 9.3 for some non-mainstream platforms
      that we haven't been testing in the buildfarm, including icc on ia64,
      HPPA, and Alpha.
      
      This commit effectively back-patches commits e5592c61, 89779bf2,
      and 747ca669, though I did it just by copying the file (less copyright
      date updates) rather than by cherry-picking those commits.
      
      Per an attempt to run gaur and pademelon over old branches they've
      not been run on since ~2013.
      d7dbc882
    • Andres Freund's avatar
      Remove trailing commas in enums. · b5450859
      Andres Freund authored
      These aren't valid C89. Found thanks to gcc's -Wc90-c99-compat. These
      exist in differing places in most supported branches.
      b5450859
  3. Apr 14, 2016
    • Tom Lane's avatar
      Fix pg_dump so pg_upgrade'ing an extension with simple opfamilies works. · 6bb42d52
      Tom Lane authored
      As reported by Michael Feld, pg_upgrade'ing an installation having
      extensions with operator families that contain just a single operator class
      failed to reproduce the extension membership of those operator families.
      This caused no immediate ill effects, but would create problems when later
      trying to do a plain dump and restore, because the seemingly-not-part-of-
      the-extension operator families would appear separately in the pg_dump
      output, and then would conflict with the families created by loading the
      extension.  This has been broken ever since extensions were introduced,
      and many of the standard contrib extensions are affected, so it's a bit
      astonishing nobody complained before.
      
      The cause of the problem is a perhaps-ill-considered decision to omit
      such operator families from pg_dump's output on the grounds that the
      CREATE OPERATOR CLASS commands could recreate them, and having explicit
      CREATE OPERATOR FAMILY commands would impede loading the dump script into
      pre-8.3 servers.  Whatever the merits of that decision when 8.3 was being
      written, it looks like a poor tradeoff now.  We can fix the pg_upgrade
      problem simply by removing that code, so that the operator families are
      dumped explicitly (and then will be properly made to be part of their
      extensions).
      
      Although this fixes the behavior of future pg_upgrade runs, it does nothing
      to clean up existing installations that may have improperly-linked operator
      families.  Given the small number of complaints to date, maybe we don't
      need to worry about providing an automated solution for that; anyone who
      needs to clean it up can do so with manual "ALTER EXTENSION ADD OPERATOR
      FAMILY" commands, or even just ignore the duplicate-opfamily errors they
      get during a pg_restore.  In any case we need this fix.
      
      Back-patch to all supported branches.
      
      Discussion: <20228.1460575691@sss.pgh.pa.us>
      6bb42d52
  4. Apr 12, 2016
    • Tom Lane's avatar
      Fix freshly-introduced PL/Python portability bug. · 9422b61d
      Tom Lane authored
      It turns out that those PyErr_Clear() calls I removed from plpy_elog.c
      in 7e3bb080 et al were not quite as random as they appeared: they
      mask a Python 2.3.x bug.  (Specifically, it turns out that PyType_Ready()
      can fail if the error indicator is set on entry, and PLy_traceback's fetch
      of frame.f_code may be the first operation in a session that requires the
      "frame" type to be readied.  Ick.)  Put back the clear call, but in a more
      centralized place closer to what it's protecting, and this time with a
      comment warning what it's really for.
      
      Per buildfarm member prairiedog.  Although prairiedog was only failing
      on HEAD, it seems clearly possible for this to occur in older branches
      as well, so back-patch to 9.2 the same as the previous patch.
      9422b61d
  5. Apr 11, 2016
    • Tom Lane's avatar
      Fix access-to-already-freed-memory issue in plpython's error handling. · e1f08ba1
      Tom Lane authored
      PLy_elog() could attempt to access strings that Python had already freed,
      because the strings that PLy_get_spi_error_data() returns are simply
      pointers into storage associated with the error "val" PyObject.  That's
      fine at the instant PLy_get_spi_error_data() returns them, but just after
      that PLy_traceback() intentionally releases the only refcount on that
      object, allowing it to be freed --- so that the strings we pass to
      ereport() are dangling pointers.
      
      In principle this could result in garbage output or a coredump.  In
      practice, I think the risk is pretty low, because there are no Python
      operations between where we decrement that refcount and where we use the
      strings (and copy them into PG storage), and thus no reason for Python
      to recycle the storage.  Still, it's clearly hazardous, and it leads to
      Valgrind complaints when running under a Valgrind that hasn't been
      lobotomized to ignore Python memory allocations.
      
      The code was a mess anyway: we fetched the error data out of Python
      (clearing Python's error indicator) with PyErr_Fetch, examined it, pushed
      it back into Python with PyErr_Restore (re-setting the error indicator),
      then immediately pulled it back out with another PyErr_Fetch.  Just to
      confuse matters even more, there were some gratuitous-and-yet-hazardous
      PyErr_Clear calls in the "examine" step, and we didn't get around to doing
      PyErr_NormalizeException until after the second PyErr_Fetch, making it even
      less clear which object was being manipulated where and whether we still
      had a refcount on it.  (If PyErr_NormalizeException did substitute a
      different "val" object, it's possible that the problem could manifest for
      real, because then we'd be doing assorted Python stuff with no refcount
      on the object we have string pointers into.)
      
      So, rearrange all that into some semblance of sanity, and don't decrement
      the refcount on the Python error objects until the end of PLy_elog().
      In HEAD, I failed to resist the temptation to reformat some messy bits
      from 5c3c3cd0 along the way.
      
      Back-patch as far as 9.2, because the code is substantially the same
      that far back.  I believe that 9.1 has the bug as well; but the code
      around it is rather different and I don't want to take a chance on
      breaking something for what seems a low-probability problem.
      e1f08ba1
  6. Apr 08, 2016
  7. Apr 06, 2016
  8. Apr 04, 2016
    • Tom Lane's avatar
      Fix latent portability issue in pgwin32_dispatch_queued_signals(). · 5496c75d
      Tom Lane authored
      The first iteration of the signal-checking loop would compute sigmask(0)
      which expands to 1<<(-1) which is undefined behavior according to the
      C standard.  The lack of field reports of trouble suggest that it
      evaluates to 0 on all existing Windows compilers, but that's hardly
      something to rely on.  Since signal 0 isn't a queueable signal anyway,
      we can just make the loop iterate from 1 instead, and save a few cycles
      as well as avoiding the undefined behavior.
      
      In passing, avoid evaluating the volatile expression UNBLOCKED_SIGNAL_QUEUE
      twice in a row; there's no reason to waste cycles like that.
      
      Noted by Aleksander Alekseev, though this isn't his proposed fix.
      Back-patch to all supported branches.
      5496c75d
  9. Mar 30, 2016
  10. Mar 29, 2016
    • Tom Lane's avatar
      Avoid possibly-unsafe use of Windows' FormatMessage() function. · b4b06931
      Tom Lane authored
      Whenever this function is used with the FORMAT_MESSAGE_FROM_SYSTEM flag,
      it's good practice to include FORMAT_MESSAGE_IGNORE_INSERTS as well.
      Otherwise, if the message contains any %n insertion markers, the function
      will try to fetch argument strings to substitute --- which we are not
      passing, possibly leading to a crash.  This is exactly analogous to the
      rule about not giving printf() a format string you're not in control of.
      
      Noted and patched by Christian Ullrich.
      Back-patch to all supported branches.
      b4b06931
  11. Mar 28, 2016
  12. Mar 27, 2016
    • Andres Freund's avatar
      Change various Gin*Is* macros to return 0/1. · 290cc21d
      Andres Freund authored
      Returning the direct result of bit arithmetic, in a macro intended to be
      used in a boolean manner, can be problematic if the return value is
      stored in a variable of type 'bool'. If bool is implemented using C99's
      _Bool, that can lead to comparison failures if the variable is then
      compared again with the expression (see ginStepRight() for an example
      that fails), as _Bool forces the result to be 0/1. That happens in some
      configurations of newer MSVC compilers.  It's also problematic when
      storing the result of such an expression in a narrower type.
      
      Several gin macros have been declared in that style since gin's initial
      commit in 8a3631f8.
      
      There's a lot more macros like this, but this is the only one causing
      regression test failures; and I don't want to commit and backpatch a
      larger patch with lots of conflicts just before the next set of minor
      releases.
      
      Discussion: 20150811154237.GD17575@awork2.anarazel.de
      Backpatch: All supported branches
      290cc21d
  13. Mar 26, 2016
    • Tom Lane's avatar
      Modernize zic's test for valid timezone abbreviations. · 7a68106e
      Tom Lane authored
      We really need to sync all of our IANA-derived timezone code with upstream,
      but that's going to be a large patch and I certainly don't care to shove
      such a thing into stable branches immediately before a release.  As a
      stopgap, copy just the tzcode2016c logic that checks validity of timezone
      abbreviations.  This prevents getting multiple "time zone abbreviation
      differs from POSIX standard" bleats with tzdata 2014b and later.
      7a68106e
    • Tom Lane's avatar
      Update time zone data files to tzdata release 2016c. · 96fa3745
      Tom Lane authored
      DST law changes in Azerbaijan, Chile, Haiti, Palestine, and Russia (Altai,
      Astrakhan, Kirov, Sakhalin, Ulyanovsk regions).  Historical corrections
      for Lithuania, Moldova, Russia (Kaliningrad, Samara, Volgograd).
      
      As of 2015b, the keepers of the IANA timezone database started to use
      numeric time zone abbreviations (e.g., "+04") instead of inventing
      abbreviations not found in the wild like "ASTT".  This causes our rather
      old copy of zic to whine "warning: time zone abbreviation differs from
      POSIX standard" several times during "make install".  This warning is
      harmless according to the IANA folk, and I don't see any problems with
      these abbreviations in some simple tests; but it seems like now would be
      a good time to update our copy of the tzcode stuff.  I'll look into that
      soon.
      96fa3745
  14. Mar 19, 2016
    • Andrew Dunstan's avatar
      Remove dependency on psed for MSVC builds. · 89bf78a9
      Andrew Dunstan authored
      Modern Perl has removed psed from its core distribution, so it might not
      be readily available on some build platforms. We therefore replace its
      use with a Perl script generated by s2p, which is equivalent to the sed
      script. The latter is retained for non-MSVC builds to avoid creating a
      new hard dependency on Perl for non-Windows tarball builds.
      
      Backpatch to all live branches.
      
      Michael Paquier and me.
      89bf78a9
  15. Mar 17, 2016
    • Tom Lane's avatar
      Fix "pg_bench -C -M prepared". · be6f9ea2
      Tom Lane authored
      This didn't work because when we dropped and re-established a database
      connection, we did not bother to reset session-specific state such as
      the statements-are-prepared flags.
      
      The st->prepared[] array certainly needs to be flushed, and I cleared a
      couple of other fields as well that couldn't possibly retain meaningful
      state for a new connection.
      
      In passing, fix some bogus comments and strange field order choices.
      
      Per report from Robins Tharakan.
      be6f9ea2
  16. Mar 15, 2016
    • Tom Lane's avatar
      Cope if platform declares mbstowcs_l(), but not locale_t, in <xlocale.h>. · e39f86fe
      Tom Lane authored
      Previously, we included <xlocale.h> only if necessary to get the definition
      of type locale_t.  According to notes in PGAC_TYPE_LOCALE_T, this is
      important because on some versions of glibc that file supplies an
      incompatible declaration of locale_t.  (This info may be obsolete, because
      on my RHEL6 box that seems to be the *only* definition of locale_t; but
      there may still be glibc's in the wild for which it's a live concern.)
      
      It turns out though that on FreeBSD and maybe other BSDen, you can get
      locale_t from stdlib.h or locale.h but mbstowcs_l() and friends only from
      <xlocale.h>.  This was leaving us compiling calls to mbstowcs_l() and
      friends with no visible prototype, which causes a warning and could
      possibly cause actual trouble, since it's not declared to return int.
      
      Hence, adjust the configure checks so that we'll include <xlocale.h>
      either if it's necessary to get type locale_t or if it's necessary to
      get a declaration of mbstowcs_l().
      
      Report and patch by Aleksander Alekseev, somewhat whacked around by me.
      Back-patch to all supported branches, since we have been using
      mbstowcs_l() since 9.1.
      e39f86fe
  17. Mar 14, 2016
    • Tom Lane's avatar
      Add missing NULL terminator to list_SECURITY_LABEL_preposition[]. · 39b3ea71
      Tom Lane authored
      On the machines I tried this on, pressing TAB after SECURITY LABEL led to
      being offered ON and FOR as intended, plus random other keywords (varying
      across machines).  But if you were a bit more unlucky you'd get a crash,
      as reported by nummervet@mail.ru in bug #14019.
      
      Seems to have been an aboriginal error in the SECURITY LABEL patch,
      commit 4d355a83.  Hence, back-patch to all supported versions.
      There's no bug in HEAD, though, thanks to our recent tab-completion
      rewrite.
      39b3ea71
  18. Mar 10, 2016
    • Magnus Hagander's avatar
      Avoid crash on old Windows with AVX2-capable CPU for VS2013 builds · 78b59780
      Magnus Hagander authored
      The Visual Studio 2013 CRT generates invalid code when it makes a 64-bit
      build that is later used on a CPU that supports AVX2 instructions using a
      version of Windows before 7SP1/2008R2SP1.
      
      Detect this combination, and in those cases turn off the generation of
      FMA3, per recommendation from the Visual Studio team.
      
      The bug is actually in the CRT shipping with Visual Studio 2013, but
      Microsoft have stated they're only fixing it in newer major versions.
      The fix is therefor conditioned specifically on being built with this
      version of Visual Studio, and not previous or later versions.
      
      Author: Christian Ullrich
      78b59780
    • Andres Freund's avatar
      Avoid unlikely data-loss scenarios due to rename() without fsync. · ce8f4291
      Andres Freund authored
      Renaming a file using rename(2) is not guaranteed to be durable in face
      of crashes. Use the previously added durable_rename()/durable_link_or_rename()
      in various places where we previously just renamed files.
      
      Most of the changed call sites are arguably not critical, but it seems
      better to err on the side of too much durability.  The most prominent
      known case where the previously missing fsyncs could cause data loss is
      crashes at the end of a checkpoint. After the actual checkpoint has been
      performed, old WAL files are recycled. When they're filled, their
      contents are fdatasynced, but we did not fsync the containing
      directory. An OS/hardware crash in an unfortunate moment could then end
      up leaving that file with its old name, but new content; WAL replay
      would thus not replay it.
      
      Reported-By: Tomas Vondra
      Author: Michael Paquier, Tomas Vondra, Andres Freund
      Discussion: 56583BDD.9060302@2ndquadrant.com
      Backpatch: All supported branches
      ce8f4291
    • Andres Freund's avatar
      Introduce durable_rename() and durable_link_or_rename(). · c224d44f
      Andres Freund authored
      Renaming a file using rename(2) is not guaranteed to be durable in face
      of crashes; especially on filesystems like xfs and ext4 when mounted
      with data=writeback. To be certain that a rename() atomically replaces
      the previous file contents in the face of crashes and different
      filesystems, one has to fsync the old filename, rename the file, fsync
      the new filename, fsync the containing directory.  This sequence is not
      generally adhered to currently; which exposes us to data loss risks. To
      avoid having to repeat this arduous sequence, introduce
      durable_rename(), which wraps all that.
      
      Also add durable_link_or_rename(). Several places use link() (with a
      fallback to rename()) to rename a file, trying to avoid replacing the
      target file out of paranoia. Some of those rename sequences need to be
      durable as well. There seems little reason extend several copies of the
      same logic, so centralize the link() callers.
      
      This commit does not yet make use of the new functions; they're used in
      a followup commit.
      
      Author: Michael Paquier, Andres Freund
      Discussion: 56583BDD.9060302@2ndquadrant.com
      Backpatch: All supported branches
      c224d44f
  19. Mar 09, 2016
    • Tom Lane's avatar
      Fix incorrect handling of NULL index entries in indexed ROW() comparisons. · c8e05972
      Tom Lane authored
      An index search using a row comparison such as ROW(a, b) > ROW('x', 'y')
      would stop upon reaching a NULL entry in the "b" column, ignoring the
      fact that there might be non-NULL "b" values associated with later values
      of "a".  This happens because _bt_mark_scankey_required() marks the
      subsidiary scankey for "b" as required, which is just wrong: it's for
      a column after the one with the first inequality key (namely "a"), and
      thus can't be considered a required match.
      
      This bit of brain fade dates back to the very beginnings of our support
      for indexed ROW() comparisons, in 2006.  Kind of astonishing that no one
      came across it before Glen Takahashi, in bug #14010.
      
      Back-patch to all supported versions.
      
      Note: the given test case doesn't actually fail in unpatched 9.1, evidently
      because the fix for bug #6278 (i.e., stopping at nulls in either scan
      direction) is required to make it fail.  I'm sure I could devise a case
      that fails in 9.1 as well, perhaps with something involving making a cursor
      back up; but it doesn't seem worth the trouble.
      c8e05972
  20. Mar 08, 2016
    • Andres Freund's avatar
      ltree: Zero padding bytes when allocating memory for externally visible data. · 185c3d00
      Andres Freund authored
      ltree/ltree_gist/ltxtquery's headers stores data at MAXALIGN alignment,
      requiring some padding bytes. So far we left these uninitialized. Zero
      those by using palloc0.
      
      Author: Andres Freund
      Reported-By: Andres Freund / valgrind / buildarm animal skink
      Backpatch: 9.1-
      185c3d00
    • Andres Freund's avatar
      plperl: Correctly handle empty arrays in plperl_ref_from_pg_array. · ee06c97e
      Andres Freund authored
      plperl_ref_from_pg_array() didn't consider the case that postgrs arrays
      can have 0 dimensions (when they're empty) and accessed the first
      dimension without a check. Fix that by special casing the empty array
      case.
      
      Author: Alex Hunsaker
      Reported-By: Andres Freund / valgrind / buildfarm animal skink
      Discussion: 20160308063240.usnzg6bsbjrne667@alap3.anarazel.de
      Backpatch: 9.1-
      ee06c97e
  21. Mar 07, 2016
    • Tom Lane's avatar
      Fix backwards test for Windows service-ness in pg_ctl. · 15d43196
      Tom Lane authored
      A thinko in a9676139 caused pg_ctl to get it exactly backwards when
      deciding whether to report problems to the Windows eventlog or to stderr.
      Per bug #14001 from Manuel Mathar, who also identified the fix.
      Like the previous patch, back-patch to all supported branches.
      15d43196
    • Tom Lane's avatar
      Fix not-terribly-safe coding in NIImportOOAffixes() and NIImportAffixes(). · 8894c9f7
      Tom Lane authored
      There were two places in spell.c that supposed that they could search
      for a location in a string produced by lowerstr() and then transpose
      the offset into the original string.  But this fails completely if
      lowerstr() transforms any characters into characters of different byte
      length, as can happen in Turkish UTF8 for instance.
      
      We'd added some comments about this coding in commit 51e78ab4,
      but failed to realize that it was not merely confusing but wrong.
      
      Coverity complained about this code years ago, but in such an opaque
      fashion that nobody understood what it was on about.  I'm not entirely
      sure that this issue *is* what it's on about, actually, but perhaps
      this patch will shut it up -- and in any case the problem is clear.
      
      Back-patch to all supported branches.
      8894c9f7
  22. Mar 04, 2016
    • Robert Haas's avatar
      Fix compile breakage due to 0315dfa8. · 756c0f42
      Robert Haas authored
      I wasn't careful enough when back-patching.
      756c0f42
    • Robert Haas's avatar
      Fix query-based tab completion for multibyte characters. · c658d5a9
      Robert Haas authored
      The existing code confuses the byte length of the string (which is
      relevant when passing it to pg_strncasecmp) with the character length
      of the string (which is relevant when it is used with the SQL substring
      function).  Separate those two concepts.
      
      Report and patch by Kyotaro Horiguchi, reviewed by Thomas Munro and
      reviewed and further revised by me.
      c658d5a9
  23. Mar 01, 2016
    • Tom Lane's avatar
      Improve error message for rejecting RETURNING clauses with dropped columns. · dcba544d
      Tom Lane authored
      This error message was written with only ON SELECT rules in mind, but since
      then we also made RETURNING-clause targetlists go through the same logic.
      This means that you got a rather off-topic error message if you tried to
      add a rule with RETURNING to a table having dropped columns.  Ideally we'd
      just support that, but some preliminary investigation says that it might be
      a significant amount of work.  Seeing that Nicklas Avén's complaint is the
      first one we've gotten about this in the ten years or so that the code's
      been like that, I'm unwilling to put much time into it.  Instead, improve
      the error report by issuing a different message for RETURNING cases, and
      revise the associated comment based on this investigation.
      
      Discussion: 1456176604.17219.9.camel@jordogskog.no
      dcba544d
  24. Feb 29, 2016
    • Alvaro Herrera's avatar
      Fix typos · 36d43f05
      Alvaro Herrera authored
      Author: Amit Langote
      36d43f05
    • Alvaro Herrera's avatar
      doc: document MANPATH as /usr/local/pgsql/share/man · 6fdc6262
      Alvaro Herrera authored
      The docs were advising to use /usr/local/pgsql/man instead, but that's
      wrong.
      
      Reported-By: Slawomir Sudnik
      Backpatch-To: 9.1
      Bug: #13894
      6fdc6262
    • Tom Lane's avatar
      Avoid multiple free_struct_lconv() calls on same data. · 47792639
      Tom Lane authored
      A failure partway through PGLC_localeconv() led to a situation where
      the next call would call free_struct_lconv() a second time, leading
      to free() on already-freed strings, typically leading to a core dump.
      Add a flag to remember whether we need to do that.
      
      Per report from Thom Brown.  His example case only provokes the failure
      as far back as 9.4, but nonetheless this code is obviously broken, so
      back-patch to all supported branches.
      47792639
  25. Feb 21, 2016
  26. Feb 19, 2016
    • Simon Riggs's avatar
      Correct StartupSUBTRANS for page wraparound · c063d3c4
      Simon Riggs authored
      StartupSUBTRANS() incorrectly handled cases near the max pageid in the subtrans
      data structure, which in some cases could lead to errors in startup for Hot
      Standby.
      This patch wraps the pageids correctly, avoiding any such errors.
      Identified by exhaustive crash testing by Jeff Janes.
      
      Jeff Janes
      c063d3c4
  27. Feb 18, 2016
    • Tom Lane's avatar
      Fix multiple bugs in contrib/pgstattuple's pgstatindex() function. · 29f29972
      Tom Lane authored
      Dead or half-dead index leaf pages were incorrectly reported as live, as a
      consequence of a code rearrangement I made (during a moment of severe brain
      fade, evidently) in commit d287818e.
      
      The index metapage was not counted in index_size, causing that result to
      not agree with the actual index size on-disk.
      
      Index root pages were not counted in internal_pages, which is inconsistent
      compared to the case of a root that's also a leaf (one-page index), where
      the root would be counted in leaf_pages.  Aside from that inconsistency,
      this could lead to additional transient discrepancies between the reported
      page counts and index_size, since it's possible for pgstatindex's scan to
      see zero or multiple pages marked as BTP_ROOT, if the root moves due to
      a split during the scan.  With these fixes, index_size will always be
      exactly one page more than the sum of the displayed page counts.
      
      Also, the index_size result was incorrectly documented as being measured in
      pages; it's always been measured in bytes.  (While fixing that, I couldn't
      resist doing some small additional wordsmithing on the pgstattuple docs.)
      
      Including the metapage causes the reported index_size to not be zero for
      an empty index.  To preserve the desired property that the pgstattuple
      regression test results are platform-independent (ie, BLCKSZ configuration
      independent), scale the index_size result in the regression tests.
      
      The documentation issue was reported by Otsuka Kenji, and the inconsistent
      root page counting by Peter Geoghegan; the other problems noted by me.
      Back-patch to all supported branches, because this has been broken for
      a long time.
      29f29972
  28. Feb 17, 2016
    • Tom Lane's avatar
      Make plpython cope with funny characters in function names. · 7d48349f
      Tom Lane authored
      A function name that's double-quoted in SQL can contain almost any
      characters, but we were using that name directly as part of the name
      generated for the Python-level function, and Python doesn't like
      anything that isn't pretty much a standard identifier.  To fix,
      replace anything that isn't an ASCII letter or digit with an underscore
      in the generated name.  This doesn't create any risk of duplicate Python
      function names because we were already appending the function OID to
      the generated name to ensure uniqueness.  Per bug #13960 from Jim Nasby.
      
      Patch by Jim Nasby, modified a bit by me.  Back-patch to all
      supported branches.
      7d48349f
Loading