E.29. Выпуск 12.21
Дата выпуска: 2024-11-14
В этот выпуск вошли различные исправления, внесённые после версии 12.21. За информацией о нововведениях версии 12 обратитесь к Разделу E.50.
Этот выпуск PostgreSQL должен стать последним в серии 12.X. Пользователям следует поторопиться с переходом на более новую основную версию.
E.29.1. Миграция на версию 12.21
Если используется версия 12.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 12.18, см. также Раздел E.32.
E.29.2. Изменения
Пометка кешированных планов как зависимых от выполняющих их ролей, когда защита на уровне строк (RLS) применяется для ссылки на таблицу не на верхнем уровне (Натан Боссарт) §
Если общее табличное выражение (CTE), подзапрос, подссылка, представление с контекстом безопасности вызывающего или проекция приведения в запросе ссылались на таблицу с политикой защиты на уровне строк, результирующий план не помечался как потенциально зависимый от выполняющей его роли. Это могло приводить к тому, что последующие запросы в том же сеансе выполнялись с некорректным планом, а скрытые строки возвращались или возвращаемые скрывались.
Проект PostgreSQL благодарит Вольфганга Вальтера за сообщение об этой проблеме. (CVE-2024-10976)
Библиотека libpq теперь игнорирует сообщения об ошибках, получаемые во время согласования протоколов SSL или GSS (Джейкоб Чемпион) §
Злоумышленники могут подменять реальное выходное сообщение сервера об ошибке, получаемое до того, как завершено согласование криптографического протокола. Это может приводить к различным угрозам безопасности, например, злоумышленник может подменить результат запроса, а невнимательный пользователь спутает его с реальным результатом. Лучше всего игнорировать такие сообщения об ошибках и доверять только сообщениям libpq о сбое соединения.
Проект PostgreSQL благодарит Джейкоба Чемпиона за сообщение об этой проблеме. (CVE-2024-10977)
Исправление нежелательного взаимодействия команд
SET SESSION AUTHORIZATIONиSET ROLE(Том Лейн) § §Согласно стандарту SQL, команда
SET SESSION AUTHORIZATIONимеет побочный эффект в виде выполнения командыSET ROLE NONE. Это было реализовано некорректно, что приводило к дополнительному нежелательному взаимодействию между двумя командами. В частности, откат транзакции, в которой была выполнена командаSET SESSION AUTHORIZATION, приводил к откатуROLEдоNONE, даже если ранее было другое значение, и действующий идентификатор пользователя мог отличаться от идентификатора до выполнения транзакции. Временное включениеsession_authorizationв предложенииSETфункции приводило к тому же результату. Дополнительная ошибка заключалась в том, что при исследованииcurrent_setting('role')параллельным рабочим процессом он виделnone, даже если должен был видеть иное значение.Проект PostgreSQL благодарит Тома Лейна за сообщение об этой проблеме. (CVE-2024-10978)
Запрет на изменение переменных окружения доверенным кодом PL/Perl (Эндрю Дунстан, Ной Миш) § § § §
Возможность изменять переменные окружения процессов, такие как
PATH, позволяет злоумышленнику выполнять произвольный код. Поэтому теперь это запрещено для «доверенных» процедурных языков. Чтобы исправить проблему сplperl, замените%ENVна связанный хеш, который запрещает вносить изменения с выводом предупреждения. Недоверенный языкplperluсохраняет возможность изменять переменные окружения.Проект PostgreSQL благодарит Коби Абрамса за сообщение об этой проблеме. (CVE-2024-10979)
Запрет выполнения команды
ALTER TABLE ATTACH PARTITION, если у присоединяемой таблицы есть внешний ключ, ссылающийся на секционированную таблицу (Альваро Эррера) § §Такая комбинация действий не поддерживается, и другие варианты её воспроизведения и ранее завершались ошибкой.
Запрет использования соединений или группировки с учётом секционирования, если сортировка в запросе для столбца ключа не соответствует сортировке ключа секционирования (Цзянь Хи, Веббо Хан) § §
Такие планы ранее могли приводить к некорректным результатам.
Возможность отменять второй этап построения индекса для крупных хеш-индексов (Павел Борисов) §
Исправление сбоя проверочного утверждения или сбивающего с толку сообщения об ошибке выполнения команды
COPY (, когдазапрос) TO ...запроспереписывается правиломDO INSTEAD NOTIFY(Тендер Ван, Том Лейн) §Исправление выявления асимметричных данных во время параллельного соединения по хешу (Томас Манро)
После пересекционирования внутренней стороны соединения по хешу из-за слишком большого количества накопленных кортежей в одной секции проверялось, что все кортежи секции попадали в одну и ту же дочернюю секцию. Так предполагалось, что у всех кортежей одно хеш-значение и последующее пересекционирование не может привнести улучшений. В некоторых случаях эта проверка не работала, из-за чего выполнялось бессмысленное многократное пересекционирование, что в итоге приводило к ошибке исчерпания ресурсов.
Устранение условий гонки при фиксации сериализуемой транзакции (Хейкки Линнакангас) §
Некорректная обработка недавно зафиксированной транзакции могла приводить к сбою проверочного утверждения или ошибке «could not access status of transaction» (не удалось получить состояние транзакции).
Устранение условий гонки при выполнении команды
COMMIT PREPARED, которые приводили к наличию потерянных файлов двухфазной фиксации (2PC) (У Чэнвэнь) §Параллельное выполнение нескольких команд
PREPARE TRANSACTIONмогло приводить к тому, что командаCOMMIT PREPAREDне удаляла файл состояния двухфазной фиксации на диске для завершённой транзакции. Мгновенно к негативным последствиям это не приводило, однако при последующем восстановлении после сбоя могла возникать ошибка «could not access status of transaction» (не удалось получить состояние транзакции), что требовало ручного удаления потерянного файла для восстановления службы.Предотвращение некорректного обращения к памяти после пропуска нерабочего индекса TOAST во время выполнения команды
VACUUM FULL(Тендер Ван) §Список, отслеживающий подлежащие перестройке индексы, некорректно обновлялся в этом месте кода, что могло приводить сбоям проверочных утверждений или отказам в будущем.
Исправление возможных потерь обновлений каталога «на месте» (Ной Миш) § § § § § § §
При обычном обновлении строк новая версия строки записывается, чтобы сохранить возможность отката транзакции. Однако при обновлении некоторых системных каталогов транзакции намеренно не затрагиваются, и в таком случае строка обновляется на месте. Данное исправление устраняет условия гонки, которые могли приводить к потере обновлений на месте. Одним из примеров была потеря того, что для
pg_class.relhasindexзадано значение true, что приводило к невозможности обновления нового индекса и, следовательно, его повреждению.Сброс кеша каталогов в конце процесса восстановления (Ной Миш) §
Таким образом предотвращаются сценарии, при которых обновления каталога на месте могли быть потеряны из-за использования устаревших данных из кеша каталога.
Предотвращение параллельного выполнения запросов при сдерживании прерываний (Франческо Деграсси, Ной Миш, Том Лейн) § §
С этой ситуацией невозможно было столкнуться во время обычной работы, но можно было воспроизвести при помощи тестовых сценариев, например использовав SQL-функцию в качестве опорной для B-дерева (что слишком медленно для промышленной эксплуатации). При успешном воспроизведении возникала ситуация бесконечного ожидания.
Защита от переполнения стека в libxml2, если вводные данные XML имеют слишком много уровней вложенности (Том Лейн с благодарностью Нику Велнхоферу)
Теперь вместо функции
xmlXPathCompile()используетсяxmlXPathCtxtCompile(), посколькуxmlXPathCompile()не защищает от переполнения стека при рекурсии в выпусках libxml2 ниже 2.13.4.Исправление ошибки «failed to find plan for subquery/CTE» (не удалось найти план для подзапроса/CTE) при выполнении команды
EXPLAIN(Ричард Гуо, Том Лейн) §Проблема возникала при попытке добавления ссылок в поля вывода типа RECORD подзапроса, когда подзапрос был исключён из плана в ходе оптимизации (что было возможно, по крайней мере, потому что условие
WHEREпостоянно не выполнялось). В плане не оставалось данных, позволяющих идентифицировать исходные имена полей, поэтому теперь дляN-го столбца записи снова отображаетсяf. (В действительности это корректное поведение, если вывод типа RECORD является результатом конструкцииNROW().)Запрет предложения
USINGпри изменении типа генерируемого столбца (Питер Эйзентраут) §У генерируемого столбца уже есть выражение с указанием содержимого столбца, поэтому включение предложения
USINGне имеет смысла.Игнорирование ещё не определённых порталов в представлении
pg_cursors(Том Лейн) §Определённый пользователем код, исследующий это представление, мог вызываться при настройке нового курсора. Если это случалось, происходило обращение по нулевому указателю. Проблема решена определением представления так, чтобы исключать курсоры, которые ещё не полностью настроены.
Уменьшение потребления памяти при логическом декодировании (Масахико Савада) §
Теперь используется блок по умолчанию меньшего размера для хранения данных кортежей, получаемых во время логического декодирования. Таким образом снижается потеря памяти, которая, как сообщается, была существенной, возникала во время длительных транзакций и даже приводила к сбоям из-за нехватки памяти.
Повторное отключение отправки сеансовых билетов (TLSv1.2) без сохранения состояния (Даниэль Густафссон) §
Предыдущее изменение, направленное на отключение отправки сеансовых билетов (TLSv1.3) с сохранением состояния, случайным образом влекло повторное включение отправки билетов без сохранения состояния. Из-за этого некоторые клиенты ошибочно полагали, что возобновление сессий TLS возможно.
Предотвращение ошибки «wrong tuple length» (некорректная длина кортежа) при удалении базы данных с большим числом записей в ACL (разрешений) (Аюш Тивари) § §
Возможность корректировать параметры
session_authorizationиroleв параллельных рабочих процессах (Том Лейн) §В коде предусмотрено разрешение на изменение параметров сервера через предложения
SETфункций, но не другими способами внутри параллельного рабочего процесса. Однако ранее для двух этих параметров предложенияSETне работали.Исправление поведения стабильных функций, вызываемых из списка аргументов оператора
CALL, гдеCALLнаходится в блокеEXCEPTIONPL/pgSQL (Том Лейн) §Как и до исправления в предыдущем квартальном выпуске, таким функциям ранее передавался неправильный снимок, в результате чего они получали устаревшие значения строк, которые уже изменились с момента начала внешней транзакции.
Разбор параметра подключения
keepalivesв libpq так же, как и других целочисленных параметров (Юто Сасаки) §В используемом коде запрещались завершающие пробелы в значении параметра, в отличие от других случаев. Это оказалось проблемой, например, в использовании ecpg.
Исправление чтения за пределами выборки при разборе некорректных даты и времени в ecpglib (Брюс Момджян, Павел Некрасов) §
Ранее было возможно попытаться считать расположение непосредственно перед началом константного массива. Однако практические следствия этой ошибки незначительны.
Включение исходной истории линии времени в вывод отладочных сообщений pg_rewind (Хейкки Линнакангас) §
Так было задумано изначально, но из-за ошибки в коде вместо исходной истории всегда выводилась пустая строка.
Предотвращение попытки перестройки индексов временных таблиц, индексов в vacuumdb и при параллельной перестройке индексов с помощью reindexdb (Вайбхав С, Микаэль Пакье, Фудзии Масао, Натан Боссарт) § §
Перестройка индексов временных таблиц других сеансов невозможна, но проверка на пропуск отсутствовала в некоторых местах кода, что вело к нежелательным сбоям.
Реализация проверки отношений последовательностей в соответствующих функциях
contrib/pageinspectиcontrib/pgstattuple(Натан Боссарт, Аюш Ватса) § §Такая проверка была реализована ранее, но работала некорректно после реализации нестандартных методов доступа для таблиц.
Исправление некорректного кода, генерируемого LLVM, на платформах ARM64 (Томас Манро, Антонин Боннефой) §
При использовании JIT-компиляции на платформах ARM генерируемый код не поддерживал расстояния перемещения больше 32 бит, из-за чего он мог размещаться неудачно и вызывать сбои сервера в системах с большим объёмом памяти.
Исправление нескольких случаев, в которых допускалось, что время начала процесса (представленное
time_t) уместится в значение типаlong(Макс Джонсон, Натан Боссарт) §На платформах, где тип
longвмещает 32 бита (особенно на Windows), после 2038 года произойдёт сбой. В основном он проявит себя косметически, но в особенности зависнет командаpg_ctl start.Предотвращение сбоев «nothing provides perl(PostgreSQL::Test::Utils)» (отсутствует perl(PostgreSQL::Test::Utils)) во время сборки пакетов RPM PostgreSQL (Ной Миш) §
Исправление сборки с Strawberry Perl на Windows (Эндрю Дунстан) §
Обновление данных часовых поясов до версии tzdata 2024b (Том Лейн) § §
В этом выпуске tzdata изменяются старые имена часовых поясов, совместимые с System V, теперь они дублируют соответствующие географические зоны. Например,
PST8PDTтеперь является псевдонимом дляAmerica/Los_Angeles. Единственное видимое последствие заключается в том, что для временных отметок до введения стандартизированных часовых поясов часовой пояс будет означать среднее солнечное время для заданного места. Например, вPST8PDTввод с типом данныхtimestamptz, такой как1801-01-01 00:00, раньше отображался как1801-01-01 00:00:00-08, а теперь — как1801-01-01 00:00:00-07:52:58.Кроме того, выполнены корректировки исторических данных для Мексики, Монголии и Португалии. Часовой пояс
Asia/Choibalsanтеперь является псевдонимом дляAsia/Ulaanbaatar, а не отдельным часовым поясом, в основном потому что разница между ними, как оказалось, основана на недостоверных данных.
E.29. Release 12.21
Release date: 2024-11-14
This release contains a variety of fixes from 12.20. For information about new features in major release 12, see Section E.50.
This is expected to be the last PostgreSQL release in the 12.X series. Users are encouraged to update to a newer release branch soon.
E.29.1. Migration to Version 12.21
A dump/restore is not required for those running 12.X.
However, if you are upgrading from a version earlier than 12.18, see Section E.32.
E.29.2. Changes
Ensure cached plans are marked as dependent on the calling role when RLS applies to a non-top-level table reference (Nathan Bossart) §
If a CTE, subquery, sublink, security invoker view, or coercion projection in a query references a table with row-level security policies, we neglected to mark the resulting plan as potentially dependent on which role is executing it. This could lead to later query executions in the same session using the wrong plan, and then returning or hiding rows that should have been hidden or returned instead.
The PostgreSQL Project thanks Wolfgang Walther for reporting this problem. (CVE-2024-10976)
Make libpq discard error messages received during SSL or GSS protocol negotiation (Jacob Champion) §
An error message received before encryption negotiation is completed might have been injected by a man-in-the-middle, rather than being real server output. Reporting it opens the door to various security hazards; for example, the message might spoof a query result that a careless user could mistake for correct output. The best answer seems to be to discard such data and rely only on libpq's own report of the connection failure.
The PostgreSQL Project thanks Jacob Champion for reporting this problem. (CVE-2024-10977)
Fix unintended interactions between
SET SESSION AUTHORIZATIONandSET ROLE(Tom Lane) § §The SQL standard mandates that
SET SESSION AUTHORIZATIONhave a side-effect of doingSET ROLE NONE. Our implementation of that was flawed, creating more interaction between the two settings than intended. Notably, rolling back a transaction that had doneSET SESSION AUTHORIZATIONwould revertROLEtoNONEeven if that had not been the previous state, so that the effective user ID might now be different from what it had been before the transaction. Transiently settingsession_authorizationin a functionSETclause had a similar effect. A related bug was that if a parallel worker inspectedcurrent_setting('role'), it sawnoneeven when it should see something else.The PostgreSQL Project thanks Tom Lane for reporting this problem. (CVE-2024-10978)
Prevent trusted PL/Perl code from changing environment variables (Andrew Dunstan, Noah Misch) § § § §
The ability to manipulate process environment variables such as
PATHgives an attacker opportunities to execute arbitrary code. Therefore, “trusted” PLs must not offer the ability to do that. To fixplperl, replace%ENVwith a tied hash that rejects any modification attempt with a warning. Untrustedplperluretains the ability to change the environment.The PostgreSQL Project thanks Coby Abrams for reporting this problem. (CVE-2024-10979)
Disallow
ALTER TABLE ATTACH PARTITIONif the table to be attached has a foreign key referencing the partitioned table (Álvaro Herrera) § §This arrangement is not supported, and other ways of creating it already fail.
Don't use partitionwise joins or grouping if the query's collation for the key column doesn't match the partition key's collation (Jian He, Webbo Han) § §
Such plans could produce incorrect results.
Allow cancellation of the second stage of index build for large hash indexes (Pavel Borisov) §
Fix assertion failure or confusing error message for
COPY (, when thequery) TO ...queryis rewritten by aDO INSTEAD NOTIFYrule (Tender Wang, Tom Lane) §Fix detection of skewed data during parallel hash join (Thomas Munro) §
After repartitioning the inner side of a hash join because one partition has accumulated too many tuples, we check to see if all the partition's tuples went into the same child partition, which suggests that they all have the same hash value and further repartitioning cannot improve matters. This check malfunctioned in some cases, allowing repeated futile repartitioning which would eventually end in a resource-exhaustion error.
Fix race condition in committing a serializable transaction (Heikki Linnakangas) §
Mis-processing of a recently committed transaction could lead to an assertion failure or a “could not access status of transaction” error.
Fix race condition in
COMMIT PREPAREDthat resulted in orphaned 2PC files (wuchengwen) §A concurrent
PREPARE TRANSACTIONcould causeCOMMIT PREPAREDto not remove the on-disk two-phase state file for the completed transaction. There was no immediate ill effect, but a subsequent crash-and-recovery could fail with “could not access status of transaction”, requiring manual removal of the orphaned file to restore service.Avoid invalid memory accesses after skipping an invalid toast index during
VACUUM FULL(Tender Wang) §A list tracking yet-to-be-rebuilt indexes was not properly updated in this code path, risking assertion failures or crashes later on.
Fix ways in which an “in place” catalog update could be lost (Noah Misch) § § § § § § §
Normal row updates write a new version of the row to preserve rollback-ability of the transaction. However, certain system catalog updates are intentionally non-transactional and are done with an in-place update of the row. These patches fix race conditions that could cause the effects of an in-place update to be lost. As an example, it was possible to forget having set
pg_class.relhasindexto true, preventing updates of the new index and thus causing index corruption.Reset catalog caches at end of recovery (Noah Misch) §
This prevents scenarios wherein an in-place catalog update could be lost due to using stale data from a catalog cache.
Avoid using parallel query while holding off interrupts (Francesco Degrassi, Noah Misch, Tom Lane) § §
This situation cannot arise normally, but it can be reached with test scenarios such as using a SQL-language function as B-tree support (which would be far too slow for production usage). If it did occur it would result in an indefinite wait.
Guard against stack overflow in libxml2 with too-deeply-nested XML input (Tom Lane, with hat tip to Nick Wellnhofer) §
Use
xmlXPathCtxtCompile()rather thanxmlXPathCompile(), because the latter fails to protect itself against recursion-to-stack-overflow in libxml2 releases before 2.13.4.Fix “failed to find plan for subquery/CTE” errors in
EXPLAIN(Richard Guo, Tom Lane) §This case arose while trying to print references to fields of a RECORD-type output of a subquery when the subquery has been optimized out of the plan altogether (which is possible at least in the case that it has a constant-false
WHEREcondition). Nothing remains in the plan to identify the original field names, so fall back to printingffor theNN'th record column. (That's actually the right thing anyway, if the record output arose from aROW()constructor.)Disallow a
USINGclause when altering the type of a generated column (Peter Eisentraut) §A generated column already has an expression specifying the column contents, so including
USINGdoesn't make sense.Ignore not-yet-defined Portals in the
pg_cursorsview (Tom Lane) §It is possible for user-defined code that inspects this view to be called while a new cursor is being set up, and if that happens a null pointer dereference would ensue. Avoid the problem by defining the view to exclude incompletely-set-up cursors.
Reduce memory consumption of logical decoding (Masahiko Sawada) §
Use a smaller default block size to store tuple data received during logical replication. This reduces memory wastage, which has been reported to be severe while processing long-running transactions, even leading to out-of-memory failures.
Re-disable sending of stateless (TLSv1.2) session tickets (Daniel Gustafsson) §
A previous change to prevent sending of stateful (TLSv1.3) session tickets accidentally re-enabled sending of stateless ones. Thus, while we intended to prevent clients from thinking that TLS session resumption is supported, some still did.
Avoid “wrong tuple length” failure when dropping a database with many ACL (permission) entries (Ayush Tiwari) § §
Allow adjusting the
session_authorizationandrolesettings in parallel workers (Tom Lane) §Our code intends to allow modifiable server settings to be set by function
SETclauses, but not otherwise within a parallel worker.SETclauses failed for these two settings, though.Fix behavior of stable functions called from a
CALLstatement's argument list, when theCALLis within a PL/pgSQLEXCEPTIONblock (Tom Lane) §As with a similar fix in our previous quarterly releases, this case allowed such functions to be passed the wrong snapshot, causing them to see stale values of rows modified since the start of the outer transaction.
Parse libpq's
keepalivesconnection option in the same way as other integer-valued options (Yuto Sasaki) §The coding used here rejected trailing whitespace in the option value, unlike other cases. This turns out to be problematic in ecpg's usage, for example.
In ecpglib, fix out-of-bounds read when parsing incorrect datetime input (Bruce Momjian, Pavel Nekrasov) §
It was possible to try to read the location just before the start of a constant array. Real-world consequences seem minimal, though.
Include the source timeline history in pg_rewind's debug output (Heikki Linnakangas) §
This was the intention to begin with, but a coding error caused the source history to always print as empty.
Avoid trying to reindex temporary tables and indexes in vacuumdb and in parallel reindexdb (VaibhaveS, Michael Paquier, Fujii Masao, Nathan Bossart) § §
Reindexing other sessions' temporary tables cannot work, but the check to skip them was missing in some code paths, leading to unwanted failures.
Allow inspection of sequence relations in relevant functions of
contrib/pageinspectandcontrib/pgstattuple(Nathan Bossart, Ayush Vatsa) § §This had been allowed in the past, but it got broken during the introduction of non-default access methods for tables.
Fix incorrect LLVM-generated code on ARM64 platforms (Thomas Munro, Anthonin Bonnefoy) §
When using JIT compilation on ARM platforms, the generated code could not support relocation distances exceeding 32 bits, allowing unlucky placement of generated code to cause server crashes on large-memory systems.
Fix a few places that assumed that process start time (represented as a
time_t) will fit into alongvalue (Max Johnson, Nathan Bossart) §On platforms where
longis 32 bits (notably Windows), this coding would fail after Y2038. Most of the failures appear only cosmetic, but notablypg_ctl startwould hang.Prevent “nothing provides perl(PostgreSQL::Test::Utils)” failures while building RPM packages of PostgreSQL (Noah Misch) §
Fix building with Strawberry Perl on Windows (Andrew Dunstan) §
Update time zone data files to tzdata release 2024b (Tom Lane) § §
This tzdata release changes the old System-V-compatibility zone names to duplicate the corresponding geographic zones; for example
PST8PDTis now an alias forAmerica/Los_Angeles. The main visible consequence is that for timestamps before the introduction of standardized time zones, the zone is considered to represent local mean solar time for the named location. For example, inPST8PDT,timestamptzinput such as1801-01-01 00:00would previously have been rendered as1801-01-01 00:00:00-08, but now it is rendered as1801-01-01 00:00:00-07:52:58.Also, historical corrections for Mexico, Mongolia, and Portugal. Notably,
Asia/Choibalsanis now an alias forAsia/Ulaanbaatarrather than being a separate zone, mainly because the differences between those zones were found to be based on untrustworthy data.