E.28. Выпуск 11.22

Дата выпуска: 2023-11-09

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

Этот выпуск PostgreSQL должен стать последним в серии 11.X. Пользователям следует поторопиться с переходом на более новую основную версию.

E.28.1. Миграция на версию 11.22

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

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

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

  • Исправление обработки аргументов неизвестного типа в агрегатных функциях DISTINCT "any" (Том Лейн).

    Эта ошибка приводила к тому, что значение типа text интерпретировалось как значение типа unknown (то есть строка, завершающаяся нулевым символом), при этом во время выполнения могло раскрываться содержимое памяти сервера после значения text.

    Проект PostgreSQL благодарит Цзинчжоу Фу за сообщение об этой проблеме. (CVE-2023-5868)

  • Выявление целочисленного переполнения при вычислении новых размерностей массива (Том Лейн)

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

    Проект PostgreSQL благодарит Педро Гальегоса за сообщение об этой проблеме. (CVE-2023-5869)

  • Запрет для роли pg_signal_backend отправлять сигналы обслуживающим процессам и процессам автоочистки (Ной Миш, Йелте Феннема-Нио)

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

    Также теперь гарантируется, что в таких процессах корректно задан параметр is_superuser. Конкретных примеров влияния этого упущения на безопасность не обнаружено, но для некоторых расширений оно могло оказаться существенным.

    Проект PostgreSQL благодарит Хеманта Сандрану и Махендракара Шринивасарао за сообщение об этой проблеме. (CVE-2023-5870)

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

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

  • Исправление позиции индекса-B-дерева для предложений ScalarArrayOpExpr в особых случаях при обработке пометки/восстановления (Питер Гейган)

    При восстановлении сканирования индекса с ранее помеченной позицией в коде могли пропускаться необходимые шаги настройки, если сканирование продвинулось точно до конца совпадений для предложения ScalarArrayOpExpr (то есть indexcol = ANY(ARRAY[])). Это могло приводить к потере некоторых строк, которые должны были быть включены в выборку при сканировании.

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

  • Устранение сбоя при применении функции cursor_to_xmlschema() к порталу, не возвращающему данные (Боюй Ян)

  • Более корректная обработка нерабочих индексов специальными SQL-функциями (Ной Миш)

    Если одна из функций pgstatindex(), pgstatginindex(), pgstatashindex() или pgstattuple() применяется к нерабочему индексу, в журнал теперь выводится сообщение об ошибке. Если одна из функций brin_desummarize_range(), brin_summarize_new_values(), brin_summarize_range() или gin_clean_pending_list() применяется к нерабочему индексу, сообщение вносится в журнал в зависимости от уровня отладки. Раньше эти функции пытались обработать индекс и демонстрировали странное поведение в зависимости от результатов невыполненной команды CREATE INDEX.

  • Предотвращение сбоя из-за преждевременного выделения памяти при длинных входных данных в функции to_tsvector() (Том Лейн)

  • Исключение выделения лишнего пространства на диске для созданного tsvector в функции tsvectorrecv() (Денис Ерохин)

    Если входящий вектор включает данные о местоположении, в результате выполнения двоичной функции приёма использовалось лишнее пространство (примерно равное размеру данных о положении) в готовом tsvector. В особых случаях это могло приводить к сбою из-за ошибки «maximum total lexeme length exceeded» (превышена максимальная общая длина лексемы) для векторов, длина которых на момент создания была ниже ограничения. В любом случае это могло приводить к потере места на диске.

  • Исправление некорректного кода в функции gtsvector_picksplit() (Александр Лахин)

    Ранее могли приниматься некорректные решения о разделении страниц в индексах GiST по столбцам tsvector.

  • Обеспечение существования снимка при удалении временных таблиц условием ON COMMIT DROP (Том Лейн)

    Это исправление предотвращает возможное неправильное поведение в случаях, когда какие-либо записи каталога для временных таблиц имеют достаточно длинные поля, требующие применения TOAST (например, очень сложное условие CHECK).

  • Предотвращение неправильной реакции дочерних процессов, только что созданных функцией system(), на сигналы завершения работы (Натан Боссарт)

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

  • Предотвращение разрывов чтения pg_control в соответствующих SQL-функциях (Томас Манро)

    Перед чтением pg_control получается соответствующая блокировка для обеспечения согласованного представления этого файла.

  • Отслеживание зависимостей кешированных операторов CALL и их перепланирование, если оно необходимо (Том Лейн)

    Команды DDL, такие как замена функции, встроенной в аргумент CALL, могут вызвать необходимость перепланирования CALL, кешированного PL/pgSQL. Ранее перепланирование не выполнялось, что приводило к неправильному поведению или странным ошибкам, таким как «cache lookup failed» (не удалось выполнить поиск в кеше).

  • Правильное отслеживание глубины вложенности при проверке переменных типа RECORD на внешних уровнях запроса (Ричард Гуо)

    Неправильное отслеживание могло приводить к сбоям проверочных утверждений, аварийным сбоям или ошибкам «bogus varno» (неприемлемое значение varno).

  • Предотвращение ошибки «record type has not been registered»(тип записи не зарегистрирован) при пересборке представления, содержащего ссылки на поля составных констант (Том Лейн)

  • Возможность извлечения полей из выражения ROW() типа RECORD (Том Лейн)

    Код SQL распознаёт названия полей f1, f2 и т. д. и может использовать эти имена для извлечения полей из выражения. Первоначально это изменение было внесено в версию 13, и теперь оно вносится в более старые ветки для поддержки тестов на наличие связанных с этим ошибок.

  • Исправление некорректной обработки ошибок в управлении кешем типа RECORD (Томас Манро)

    Ошибка нехватки памяти, возникающая в неподходящее время, могла оставлять после себя несогласованное состояние, приводившее к зацикливанию.

  • Устранение сбоя проверочного утверждения при повторной попытке логического декодирования в том же сеансе после ошибки (Хоу Чжицзе)

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

    Помимо экономии нескольких циклов, это улучшение предотвращает сбой после аннулирования кеша для операторов, которые не должны создавать снимок, таких как SET TRANSACTION ISOLATION LEVEL.

  • Сохранение передаваемых по ссылке значений attmissingval в долгосрочном контексте на время их использования (Эндрю Дунстан)

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

  • Перерасчёт эффективного значения search_path после ALTER ROLE (Джефф Дэвис)

    Это улучшение гарантирует, что после переименования роли значение специальной строки $user будет переопределено.

  • Исправление порядка операций в GenericXLogFinish (Джефф Девис)

    В коде были нарушены условия, необходимые для обеспечения безопасности данных при сбое, поскольку запись в WAL происходила перед тем, как изменённые буферы помечались как «грязные». В коде ядра эта функция не используется, но её используют расширения (например, contrib/bloom).

  • Удаление неверного проверочного утверждения при обработке исключений PL/Python (Александр Лахин)

  • Исправление поведения утилиты pg_restore для включения в выборочное восстановление начальных прав доступа как на уровне таблицы, так и на уровне столбца для выбранных таблиц (Эйлер Тавейра, Том Лейн)

    Ранее при наличии прав обоих уровней восстанавливались только права на уровне таблицы.

  • Предотвращение создания недопустимых имён временных слотов в pg_basebackup (Йелте Феннема)

    Проблема наблюдалась только при соединении с сервером через pgbouncer.

  • Исключение сообщений о повреждении данных при прерванном удалении страницы в contrib/amcheck (Ной Миш)

    Это исправление предотвращает выдачу несоответствующих сообщений об ошибках «the first child of leftmost target page is not leftmost of its level» (первый дочерний элемент крайней левой целевой страницы не является крайним левым на её уровне), «block NNNN is not leftmost» (блок NNNN не является крайним левым) или «left link/right link pair in index XXXX not in agreement» (пара левая ссылка/правая ссылка в индексе XXXX не согласуется). Эти сообщения появлялись, если модуль amcheck запускался после незавершённого удаления страницы индекса-B-дерева и до выполнения очистки VACUUM.

  • Исправление ошибки в индексах contrib/btree_gin по столбцам interval, проявлявшейся при сканировании индекса с использованием оператора < или <= (Дин Рашид)

    Ранее при таком сканировании выдавались не все элементы, которые должны были.

  • Подавление различных предупреждений во время сборки в последней версии macOS (Том Лейн)

    В среде Xcode 15 (выпущенной вместе с macOS Sonoma) изменилось поведение компоновщика таким образом, что при сборке PostgreSQL появляется множество предупреждений о дублирующихся библиотеках. Они безвредны, но раздражают, поэтому повторное упоминание библиотек было удалено. Также исключено использование флага компоновщика -multiply_defined suppress, который долгое время не использовался и стал причиной множества жалоб пользователей.

  • Удаление PHOT (время на островах Феникс) из списка аббревиатур часовых поясов по умолчанию (Том Лейн)

    Присутствие этой аббревиатуры в списке по умолчанию могло приводить к ошибкам в последних выпусках Debian и Ubuntu, поскольку в них больше не устанавливается базовая запись tzdb по умолчанию. Поскольку это аббревиатура для зоны с общим населением около двух десятков человек, от неё вполне можно отказаться. При необходимости её можно указать в пользовательском файле аббревиатур.