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 TYPEwhen the table has a partial exclusion constraint (Tom Lane)Fix failure of
COMMENTcommand 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()andjson_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_activitydata (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_activitydata.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/localtimesymbolic 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/localtimeis not a symlink to a zone data file, nor if the time zone is determined from theTZenvironment variable.Separately, prefer
UTCover other spellings of that time zone, when neitherTZnor/etc/localtimeprovide a hint. This fixes an annoyance introduced by tzdata 2019a's change to make theUCTandUTCzone names equivalent: initdb was then preferringUCT, which almost nobody wants.Fix ordering of
GRANTcommands 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
GRANTcommands being given in an order that didn't respect their interdependencies.Make pg_dump recreate table partitions using
CREATE TABLEthenATTACH PARTITION, rather than includingPARTITION OFin 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
ATTACHwill 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_explainto 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 localBEFORE ROW UPDATEtriggers (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)