E.19. Выпуск 11.4

Дата выпуска: 2019-06-20

В этот выпуск вошли различные исправления, внесённые после версии 11.3. За информацией о нововведениях версии 11 обратитесь к Разделу E.23.

E.19.1. Миграция на версию 11.4

Если используется версия 11.X, выгрузка/восстановление базы не требуется.

Если вы обновляете сервер с более ранней версии, чем 11.1, см. также Раздел E.22.

E.19.2. Изменения

  • Устранение возможности переполнения буфера при разборе верификатора SCRAM (Джонатан Кац, Хейкки Линнакангас, Микаэль Пакье)

    Любой прошедший проверку пользователь мог осуществить переполнение буфера в стеке, попытавшись сменить свой пароль на специально сконструированную строку. Помимо провоцирования сбоя PostgreSQL, этого могло быть достаточно для выполнения произвольного кода от имени пользователя ОС, запускающего PostgreSQL.

    Подобная возможность переполнения существовала в libpq, и эксплуатируя её, подставной сервер мог вызвать сбой клиентского приложения или, возможно, выполнить произвольный код от имени пользователя, запускавшего это приложение.

    Проект PostgreSQL благодарит Александра Лахина за сообщение об этой проблеме. (CVE-2019-10164)

  • Исправление разнообразных ошибок в логике устранения секций во время выполнения (Том Лейн, Амит Ланготе, Дэвид Роули)

    Следствием этих ошибок могли быть неправильные результаты запросов к секционированным таблицам, если сравниваемое значение, по которому производилось устранение, определялось динамически, или устранение производилось в зависимости от значений нескольких столбцов, секционирующих данные по диапазонам, либо если в условиях фигурировали стабильные (не постоянные) операторы сравнения.

  • Устранение возможности сбоя при попытке скопировать определения триггеров в новую секцию (Том Лейн)

  • Устранение сбоя команды ALTER TABLE ... ALTER COLUMN TYPE при наличии в таблице частичного ограничения-исключения (Том Лейн)

  • Ликвидация ошибки команды COMMENT при работе с комментариями ограничений доменов (Даниэль Густафссон, Микаэль Пакье)

  • Предотвращение возможного повреждения памяти в случае повторения столбцов в списке ключей хеша при агрегировании по хешу (Эндрю Гирт)

  • Исправление некорректной проверки аргумента на NULL в процессе частичного агрегирования агрегатных функций с нулём или несколькими аргументами (Дэвид Роули, Кётаро Хоригути, Андрес Фройнд)

  • Исправление ошибочного построения планов с узлами MergeAppend (Том Лейн)

    Следствием этого дефекта могли быть сообщения об ошибках «could not find pathkey item to sort» (не удалось найти элемент ключа для сортировки).

  • Исправление ошибочного вывода запросов с повторяющимися именами соединений (Филипп Дюбе)

    Результатом исправленного упущения могли быть ошибки при выгрузке/восстановлении представлений, образованных такими запросами.

  • Исправление преобразования строковых значений JSON в выходные столбцы типа JSON в функциях json_to_record() и json_populate_record() (Том Лейн)

    В таких случаях должна выдаваться константа в виде отдельного значения JSON, но код работал неправильно, если строковое значение содержало символы, требующие экранирования.

  • Исправление некорректной оптимизации квантификаторов {1,1} в регулярных выражениях (Том Лейн)

    Такие квантификаторы считались бесполезными и оптимизировались. Хотя в документации говорится, что они задают «жадное» поведение (или «нежадное» в случае «нежадной» вариации {1,1}?) для подвыражения, к которому они относятся, фактически они не действовали. Ошибка могла проявляться только с подвыражениями, содержащими группирующие скобки или обратные ссылки.

  • Недопущение записи некорректной пустой страницы индекса btree в маловероятном случае возникновения ошибки при обработке неключевых столбцов (INCLUDE) в процедуре разделения страницы (Питер Гейган)

    Некорректная страница не влияла на обычную работу с индексом, но могла вызывать ошибки при последующих операциях VACUUM. Если это произошло с одним из ваших индексов, ситуацию можно исправить, переиндексировав его.

  • Устранение возможности ошибок при инициализации данных pg_stat_activity для нового процесса (Том Лейн)

    Ранее были возможны сбои определённых операций, выполняемых внутри критической секции, например, преобразования строк, извлечённых из сертификата SSL, в кодировку базы данных. В подобных случаях могло произойти глобальное зависание базы данных из-за нарушения протокола обращения к общим данным pg_stat_activity.

  • Устранение условий гонки при проверке, продолжает ли использоваться конфликтующим главным процессом ранее созданный сегмент общей памяти (Том Лейн)

  • Исправление небезопасной реализации обработчика сигналов WAL-приёмника (Том Лейн)

    Таким образом полностью исключены маловероятные случаи, когда процесс приёмника WAL завершался аварийно или зависал, получив команду на выключение.

  • Недопущение обращений к базам данных для проверки параметров в процессах, не подключённых к определённой базе данных (Вигнеш Си, Андрес Фройнд)

    Некорректные обращения могли вызывать ошибки вида «cannot read pg_class without having selected a database» (невозможно прочитать pg_class, не выбрав базу данных).

  • Предупреждение возможного зависания в libpq при использовании SSL, когда объём данных в буфере очереди OpenSSL оказывается кратным 256 байтам (Дэвид Биндерман)

  • Улучшение обработки в initdb нескольких равнозначных названий часового пояса системы (Том Лейн, Эндрю Гирт)

    Теперь initdb будет анализировать символическую ссылку /etc/localtime, если она существует, чтобы выбрать из всех равнозначных названий часового пояса системы наиболее подходящее. Таким образом при наличии нескольких названий часового пояса initdb скорее всего выберет именно то название, которое ожидает пользователь. Если же /etc/localtime не является символической ссылкой на файл данных часового пояса и часовой пояс не задан переменной окружения TZ, поведение initdb останется прежним.

    Кроме того, теперь UTC предпочитается другим названиям этого часового пояса, когда ни TZ, ни /etc/localtime не предлагают другой вариант. Тем самым устранено неудобство, возникшее после произошедшего в tzdata 2019a изменения, сделавшего названия часового пояса UCT и UTC равнозначными: initdb выбирал обозначение UCT, что не соответствовало ожиданиям пользователей.

  • Исправление порядка команд GRANT, выдаваемых программами pg_dump и pg_dumpall для баз данных и табличных пространств (Натан Боссарт, Микаэль Пакье)

    В случае каскадных назначений прав при восстановлении мог произойти сбой, так как команды GRANT выдавались не в том порядке, в котором должны были с учётом взаимозависимостей.

  • Изменение варианта пересоздания секций в pg_dump — теперь будет выдаваться команда CREATE TABLE с последующей ATTACH PARTITION вместо использования указания PARTITION OF в команде создания таблицы (Альваро Эррера, Дэвид Роули)

    Таким образом устраняются проблемы, связанные с возможным изменением порядка столбцов в соответствии с родительской таблицей. Кроме того, секция теперь будет восстановлена из копии (в виде независимой таблицы), даже если её родительская таблица не восстановилась; при выполнении ATTACH произойдёт ошибка, но её можно просто игнорировать.

  • Устранение дезориентирующих сообщений об ошибках в reindexdb (Жюльен Руо)

  • Возвращение корректного состояния vacuumdb в случае ошибки при выполнении параллельных заданий (Жюльен Руо)

  • Исправление contrib/auto_explain для недопущения ошибок с параллельными запросами (Том Лейн)

    Ранее параллельный исполнитель мог попытаться передать на анализ свой запрос, тогда как родительский запрос в auto_explain не обрабатывался. Иногда это могло работать, хотя само по себе это неправильно, а в некоторых случаях выдавались ошибки вида «could not find key N in shm TOC» (не удалось найти ключ N в оглавлении общей памяти).

    Также исправлена ошибка со сдвигом на один, в результате которой не обязательно отслеживались все запросы, даже при доле выборки, равной 1.0.

  • В contrib/postgres_fdw теперь учитываются возможные модификации данных, производимые локальными триггерами BEFORE ROW UPDATE (Сёхей Мотидзуки)

    Если триггер изменял столбец, который не затрагивался командой UPDATE, новое значение не передавалось на удалённый сервер.

  • Недопущение ошибки в Windows в случаях, когда для базы данных выбрана кодировка SQL_ASCII, а мы пытаемся вывести в журнал строку с не ASCII-символами (Ной Миш)

    В коде предполагалось, что такие строки всегда представлены в UTF-8, и если оказывалось, что это не так, происходила ошибка. Теперь же в журнал просто передаются непреобразованные байты.

  • Обеспечение совместимости заголовочных файлов PL/pgSQL с C++ (Георгий Тарасов)

E.19. Release 11.4

Release date: 2019-06-20

This release contains a variety of fixes from 11.3. For information about new features in major release 11, see Section E.23.

E.19.1. Migration to Version 11.4

A dump/restore is not required for those running 11.X.

However, if you are upgrading from a version earlier than 11.1, see Section E.22.

E.19.2. Changes

  • Fix buffer-overflow hazards in SCRAM verifier parsing (Jonathan Katz, Heikki Linnakangas, Michael Paquier)

    Any authenticated user could cause a stack-based buffer overflow by changing their own password to a purpose-crafted value. In addition to the ability to crash the PostgreSQL server, this could suffice for executing arbitrary code as the PostgreSQL operating system account.

    A similar overflow hazard existed in libpq, which could allow a rogue server to crash a client or perhaps execute arbitrary code as the client's operating system account.

    The PostgreSQL Project thanks Alexander Lakhin for reporting this problem. (CVE-2019-10164)

  • Fix assorted errors in run-time partition pruning logic (Tom Lane, Amit Langote, David Rowley)

    These mistakes could lead to wrong answers in queries on partitioned tables, if the comparison value used for pruning is dynamically determined, or if multiple range-partitioned columns are involved in pruning decisions, or if stable (not immutable) comparison operators are involved.

  • Fix possible crash while trying to copy trigger definitions to a new partition (Tom Lane)

  • Fix failure of ALTER TABLE ... ALTER COLUMN TYPE when the table has a partial exclusion constraint (Tom Lane)

  • Fix failure of COMMENT command for comments on domain constraints (Daniel Gustafsson, Michael Paquier)

  • Prevent possible memory clobber when there are duplicate columns in a hash aggregate's hash key list (Andrew Gierth)

  • Fix incorrect argument null-ness checking during partial aggregation of aggregates with zero or multiple arguments (David Rowley, Kyotaro Horiguchi, Andres Freund)

  • Fix faulty generation of merge-append plans (Tom Lane)

    This mistake could lead to could not find pathkey item to sort errors.

  • Fix incorrect printing of queries with duplicate join names (Philip Dubé)

    This oversight caused a dump/restore failure for views containing such queries.

  • Fix conversion of JSON string literals to JSON-type output columns in json_to_record() and json_populate_record() (Tom Lane)

    Such cases should produce the literal as a standalone JSON value, but the code misbehaved if the literal contained any characters requiring escaping.

  • Fix misoptimization of {1,1} quantifiers in regular expressions (Tom Lane)

    Such quantifiers were treated as no-ops and optimized away; but the documentation specifies that they impose greediness, or non-greediness in the case of the non-greedy variant {1,1}?, on the subexpression they're attached to, and this did not happen. The misbehavior occurred only if the subexpression contained capturing parentheses or a back-reference.

  • Avoid writing an invalid empty btree index page in the unlikely case that a failure occurs while processing INCLUDEd columns during a page split (Peter Geoghegan)

    The invalid page would not affect normal index operations, but it might cause failures in subsequent VACUUMs. If that has happened to one of your indexes, recover by reindexing the index.

  • Avoid possible failures while initializing a new process's pg_stat_activity data (Tom Lane)

    Certain operations that could fail, such as converting strings extracted from an SSL certificate into the database encoding, were being performed inside a critical section. Failure there would result in database-wide lockup due to violating the access protocol for shared pg_stat_activity data.

  • Fix race condition in check to see whether a pre-existing shared memory segment is still in use by a conflicting postmaster (Tom Lane)

  • Fix unsafe coding in walreceiver's signal handler (Tom Lane)

    This avoids rare problems in which the walreceiver process would crash or deadlock when commanded to shut down.

  • Avoid attempting to do database accesses for parameter checking in processes that are not connected to a specific database (Vignesh C, Andres Freund)

    This error could result in failures like cannot read pg_class without having selected a database.

  • Avoid possible hang in libpq if using SSL and OpenSSL's pending-data buffer contains an exact multiple of 256 bytes (David Binderman)

  • Improve initdb's handling of multiple equivalent names for the system time zone (Tom Lane, Andrew Gierth)

    Make initdb examine the /etc/localtime symbolic link, if that exists, to break ties between equivalent names for the system time zone. This makes initdb more likely to select the time zone name that the user would expect when multiple identical time zones exist. It will not change the behavior if /etc/localtime is not a symlink to a zone data file, nor if the time zone is determined from the TZ environment variable.

    Separately, prefer UTC over other spellings of that time zone, when neither TZ nor /etc/localtime provide a hint. This fixes an annoyance introduced by tzdata 2019a's change to make the UCT and UTC zone names equivalent: initdb was then preferring UCT, which almost nobody wants.

  • Fix ordering of GRANT commands emitted by pg_dump and pg_dumpall for databases and tablespaces (Nathan Bossart, Michael Paquier)

    If cascading grants had been issued, restore might fail due to the GRANT commands being given in an order that didn't respect their interdependencies.

  • Make pg_dump recreate table partitions using CREATE TABLE then ATTACH PARTITION, rather than including PARTITION OF in the creation command (Álvaro Herrera, David Rowley)

    This avoids problems with the partition's column order possibly being changed to match the parent's. Also, a partition is now restorable from the dump (as a standalone table) even if its parent table isn't restored; the ATTACH will fail, but that can just be ignored.

  • Fix misleading error reports from reindexdb (Julien Rouhaud)

  • Ensure that vacuumdb returns correct status if an error occurs while using parallel jobs (Julien Rouhaud)

  • Fix contrib/auto_explain to not cause problems in parallel queries (Tom Lane)

    Previously, a parallel worker might try to log its query even if the parent query were not being logged by auto_explain. This would work sometimes, but it's confusing, and in some cases it resulted in failures like could not find key N in shm TOC.

    Also, fix an off-by-one error that resulted in not necessarily logging every query even when the sampling rate is set to 1.0.

  • In contrib/postgres_fdw, account for possible data modifications by local BEFORE ROW UPDATE triggers (Shohei Mochizuki)

    If a trigger modified a column that was otherwise not changed by the UPDATE, the new value was not transmitted to the remote server.

  • On Windows, avoid failure when the database encoding is set to SQL_ASCII and we attempt to log a non-ASCII string (Noah Misch)

    The code had been assuming that such strings must be in UTF-8, and would throw an error if they didn't appear to be validly encoded. Now, just transmit the untranslated bytes to the log.

  • Make PL/pgSQL's header files C++-safe (George Tarasov)

FAQ