E.8. Выпуск 16.7#
E.8. Выпуск 16.7 #
Дата релиза: 2025-02-13
Этот выпуск содержит различные исправления из версии 16.6. Для получения информации о новых функциях в основном выпуске 16 см. Раздел E.15.
E.8.1. Миграция на версию 16.7 #
Снятие дампа/восстановление не требуется для тех, кто использует 16.X.
Однако, если обновление выполнялось с версии ранее 16.5, см. Раздел E.10.
E.8.2. Изменения #
Усилена
PQescapeString
и связанные функции против неправильно закодированных входных строк (Андрес Фройнд, Ноа Миш) § § § § § §Функции цитирования данных, предоставленные libpq, теперь полностью проверяют корректность кодировки их ввода. Если обнаружены недопустимые символы, они сообщают об ошибке, если это возможно. Для тех, у которых отсутствует соглашение о возврате ошибки, выходная строка корректируется, чтобы гарантировать, что сервер сообщит о недопустимой кодировке, и никакая промежуточная обработка не будет введена в заблуждение байтами, которые могут случайно совпадать с одинарной кавычкой, обратной косой чертой и т. д.
Цель этого изменения заключалась в защите от атак с использованием SQL-инъекций, которые были возможны, если одна из этих функций использовалась для экранирования специально подготовленного ввода. Опасности не было, когда результирующая строка отправлялась непосредственно на сервер PostgreSQL (который в любом случае проверял бы ее кодировку), но существовал риск, когда она передавалась через psql или другой клиентский код. Исторически сложилось так, что такой код не тщательно проверял кодировку, и во многих случаях не было ясно, что он должен был бы делать, если бы обнаружил такую проблему.
Это исправление эффективно только в том случае, если функция экранирования данных, сервер и любое промежуточное обработка согласны с используемой кодировкой символов. Приложения, которые вставляют ненадежный ввод в SQL-команды, должны особенно тщательно следить за тем, чтобы это было так.
Приложения и драйверы, которые заключают в кавычки ненадежный ввод без использования этих функций libpq, могут быть подвержены аналогичным проблемам. Следует сначала подтвердить, что данные действительны в кодировке, ожидаемой сервером.
Проект PostgreSQL благодарит Стивена Фьюэра за сообщение об этой проблеме. (CVE-2025-1094)
Исключены параллельные рабочие из проверок привилегий подключения и ограничений (Tom Lane) §
Не проверялись
datallowconn
,rolcanlogin
и привилегииACL_CONNECT
при запуске параллельного рабочего процесса, вместо этого предполагалось, что достаточно, чтобы ведущий процесс изначально прошел аналогичные проверки. Это избегало, например, неожиданных сбоев параллельных запросов, когда ведущий процесс выполнялся от имени роли, не имеющей привилегии входа. В том же духе, ограниченияReservedConnections
,datconnlimit
иrolconnlimit
применялись только к обычным бэкендам, и учитывались только обычные бэкенды при проверке, достигнуты ли уже ограничения. Эти ограничения предназначены для предотвращения чрезмерного использования слотов процессов для обычных бэкендов — но параллельные рабочие процессы и другие специальные процессы имеют свои собственные пулы слотов процессов с собственными проверками ограничений.Исправлено возможное повторное использование устаревших результатов в оконных агрегатах (Дэвид Роули) §
Оконный агрегат с оптимизацией “условия выполнения” и типом результата с передачей по ссылке мог неправильно возвращать результат из предыдущего раздела вместо выполнения нового вычисления.
Держать
TransactionXmin
в синхронизации сMyProc->xmin
(Хейкки Линкангас) §Этот недосмотр мог позволить процессу попытаться получить доступ к данным, которые уже были удалены с помощью vacuum. Одним из известных последствий являются временные ошибки “не удалось получить статус транзакции”.
Исправлено состояние гонки, которое могло вызвать сбой при добавлении вновь вставленной записи каталога в список кэша каталога (Хейкки Линнакангас) §
Это могло привести, например, к невозможности использования вновь созданной функции в существующей сессии.
Предотвращено возможное повреждение каталога, когда системный каталог очищался одновременно с обновлением (Ноа Миш) §
Исправлена порча данных при неудачном усечении отношения (Томас Мунро) § § §
Вызовы файловой системы, необходимые для выполнения усечения отношений, могли завершиться сбоем, оставляя несогласованное состояние на диске (например, фактически восстанавливая удаленные данные). Мы не можем действительно предотвратить это, но мы можем восстановиться, превращая такие сбои в PANIC, так что согласованность восстанавливается путем воспроизведения из WAL до момента непосредственно перед попыткой усечения. Это не является очень желательным поведением, но такие сбои достаточно редки, чтобы это казалось приемлемым решением.
Предотвращение начала контрольных точек во время усечения отношений (Роберт Хаас) §
Это избегало состояния гонки, при котором измененный файл мог не быть fsync'd до завершения контрольной точки, создавая риск повреждения данных, если операционная система аварийно завершала работу вскоре после этого.
Избегалось возможное потеря обновления
pg_database
.datfrozenxid
когдаVACUUM
выполнялся одновременно сREASSIGN OWNED
, который изменял владельца этой базы данных (Кирилл Решке) §Исправлены некорректные значения
tg_updatedcols
, переданные в триггерыAFTER UPDATE
(Tom Lane) §В некоторых случаях битовая карта
tg_updatedcols
могла описывать набор столбцов, обновленных предыдущей командой в той же транзакции, вводя триггер в заблуждение и заставляя его выполнять неправильные действия.Также предотвращено раздувание памяти, вызванное созданием слишком большого количества копий битовой карты
tg_updatedcols
.Исправлено отсоединение раздела, который имеет собственное ограничение внешнего ключа, ссылающееся на разделенную таблицу (Amul Sul) §
В общих случаях внешние ключи определены на верхнем уровне секционированной таблицы; но если вместо этого один определен на секции и ссылается на секционированную таблицу, и ссылающаяся секция отсоединена, соответствующие записи
pg_constraint
были обновлены неправильно. Это приводило к ошибкам типа “не удалось найти триггеры проверки ON INSERT ограничения внешнего ключа”.Исправлена неправильная обработка
to_timestamp
сFF
форматными кодами (Tom Lane) §n
Код формата целого числа, непосредственно предшествующий
FF
, потребовал бы все доступные цифры, не оставив ни одной дляn
FF
.n
При обратной обработке выражения
XMLTABLE()
убедитесь, что имена пространств имен XML заключены в двойные кавычки, когда это необходимо (Дин Рашид) §Включена опция
ldapscheme
в выводеpg_hba_file_rules()
(Лауренц Альбе) § §Не объединены операции
UNION
, если их колляции столбцов не согласованы (Том Лейн) §Ранее игнорировались сопоставления при принятии решения о том, безопасно ли объединять шаги
UNION
в одну N-стороннюю операциюUNION
. Это было, возможно, допустимо до введения недетерминированных сопоставлений, но теперь это не так, поскольку используемое сопоставление может повлиять на определение уникальности.Предотвращены ошибки планировщика “wrong varnullingrels” после вытягивания подзапроса, который находится под внешним соединением (Tom Lane) § §
Игнорировались биты маркера обнуления отношений при поиске статистики (Ричард Гуо) §
Этот недосмотр мог привести к неиспользованию соответствующей статистики об выражениях или к ошибкам “повреждения записи MVNDistinct”.
Исправлена пропущенная обработка выражений для шагов обрезки разделов (Tom Lane) §
Этот недосмотр мог привести к ошибкам “неопознанный тип узла” и, возможно, другим проблемам в запросах, обращающихся к секционированным таблицам.
Разрешено таблицам dshash увеличиваться более чем на 1 ГБ (Маттиас ван де Меент) §
Это позволяет избежать ошибок, таких как “недопустимый запрос на выделение памяти DSA размера”. Этот случай может возникнуть, например, в транзакциях, которые обрабатывают несколько миллионов таблиц.
Избежано возможного переполнения целого числа в
bringetbitmap()
(Джеймс Хантер, Евгений Горбанёв) §Поскольку результат использовался только в статистических целях, последствия этой ошибки были в основном косметическими.
Убедиться, что уже установленный процессный защелка не предотвращает обнаружение постмастером событий сокета (Томас Мунро) §
Чрезвычайно высокая нагрузка, связанная с запуском рабочих процессов и завершением их работы, могла предотвратить своевременный ответ постмастера на входящие клиентские подключения.
Предотвращено бесконечное зацикливание серверов резервного копирования при потоковой передаче при чтении записи WAL, которая пересекает страницы (Киотаро Хоригучи, Александр Кукушкин) §
Это происходило, когда продолжение записи находилось на странице, которую нужно было прочитать из другого источника WAL.
Исправлено непреднамеренное повышение ошибок FATAL до PANIC во время раннего запуска процесса (Ноа Миш) §
Это исправляет некоторые маловероятные случаи, которые могли бы привести к “PANIC: proc_exit() вызван в дочернем процессе”.
Исправлены случаи, когда оператор или поддерживающая процедура члена семейства операторов могли стать висячей ссылкой (Tom Lane) § §
В некоторых случаях тип данных мог быть удалён, в то время как ссылки на его OID всё ещё оставались в
pg_amop
илиpg_amproc
. Хотя это не вызывало немедленных проблем, попытка удалить семейство операторов, которому он принадлежал, завершалась неудачей, и pg_dump создавал некорректный вывод при выгрузке семейства операторов. Это исправление привело к тому, что при создании и модификации семейств/классов операторов добавлялись необходимые записи зависимостей, чтобы удаление типа данных также удаляло любые зависимые элементы семейства операторов. Однако это не помогло уязвимым ранее существующим семействам операторов, поэтому также была добавлена временная мера вDROP OPERATOR FAMILY
, чтобы предотвратить сбой при удалении семейства, имеющего висячие члены.Исправлены множественные утечки памяти в выводе логического декодирования (Виньеш С, Масахико Савада, Бою Ян) § § §
Исправлена небольшая утечка памяти при обновлении настроек
application_name
илиcluster_name
(Тофиг Алиев) §Избежано переполнения целого числа при проверке условия
wal_skip_threshold
(Том Лейн) §Транзакция, которая создала очень большое отношение, могла ошибочно решить обеспечить долговечность, копируя отношение в WAL вместо выполнения fsync, тем самым отрицая смысл
wal_skip_threshold
. (Это имеет значение только когдаwal_level
установлен наminimal
, иначе копия в WAL все равно требуется.)Исправлен небезопасный порядок операций во время поиска в кэше (Ноа Миш) §
Единственным известным последствием было обычно безвредное предупреждение “вы не владеете блокировкой типа ExclusiveLock” во время
GRANT TABLESPACE
.Исправлены возможные сбои “не удалось разрешить имя” при использовании JIT на старых платформах ARM (Томас Мунро) §
Это могло произойти в результате несоответствия в настройке по умолчанию
-moutline-atomics
между gcc и clang. Известно, что по крайней мере Debian и Ubuntu поставляют компиляторы gcc и clang, которые нацелены на armv8-a, но различаются в использовании outline atomics по умолчанию.Исправлена ошибка утверждения в запросах
WITH RECURSIVE ... UNION
(Дэвид Роули) §Избежано сбоя утверждения при разборе правила, если запрос-лист операции множества содержит операции множества (Man Zeng, Tom Lane) §
Избежано сбоя утверждения в крайних случаях при запуске параллельного запроса (Tom Lane) §
Исправлена ошибка утверждения при завершении работы при записи файла статистики (Майкл Пакье) §
В
NULLIF()
избегалось передавать указатель на расширенный объект с правом записи в функцию равенства типа данных (Том Лейн) §Функция равенства могла бы изменить или удалить объект, если бы ей был передан указатель на запись, что было бы плохо, если решено вернуть его в качестве результата
NULLIF()
. Вероятно, нет проблем с какой-либо встроенной функцией равенства, но легко продемонстрировать сбой с функцией, закодированной на PL/pgSQL.Убедиться, что предварительная обработка выражений была применена к значению по умолчанию null в
INSERT
(Tom Lane) §Если целевой столбец имеет тип домена, планировщик должен вставить шаг приведения к домену, а не просто константу null, и это выражение пропустило некоторые необходимые этапы обработки. Неизвестно о последствиях для доменов, основанных на основных типах данных, но теоретически ошибка могла бы возникнуть с доменами, основанными на типах расширений.
Устранены утечки памяти в PL/Python (Mat Arye, Tom Lane) §
Повторное использование
PLyPlan.execute
илиplpy.cursor
приводило к утечке памяти на протяжении выполнения вызывающей функции PL/Python.Исправлено PL/Tcl для компиляции с Tcl 9 (Петер Айзенштраут) §
В препроцессоре ecpg исправлена возможная неправильная обработка курсоров, которые ссылаются на переменные вне области видимости (Tom Lane) §
В ecpg исправлены предупреждения времени компиляции о неподдерживаемом использовании
COPY ... FROM STDIN
(Рё Канбаяси) §Ранее предполагаемое предупреждение не было выдано из-за опечатки.
Исправлено psql для безопасной обработки имен файлов, которые закодированы в SJIS (Tom Lane) §
Некоторые двухбайтовые символы в SJIS имеют второй байт, который равен ASCII обратной косой черте (
\
). Эти символы были повреждены нормализацией имени пути, что предотвращало доступ к файлам, имена которых включают такие символы.Исправлено использование неправильной версии
pqsignal()
в pgbench и psql (Фудзии Масаао, Том Лейн) §Эта ошибка могла привести к некорректному поведению при использовании
-T
опции в pgbench или команды\watch
в psql, из-за того, что прерванные системные вызовы не возобновлялись, как ожидалось.Исправлено неправильное выполнение некоторых вложенных конструкций
\if
в pgbench (Михаил Николаев) §Команда
\if
, появляющаяся внутри ложной (не выполняемой) ветви\if
, была неправильно обработана так же, как\elif
.В pgbench исправлено возможное неправильное отображение сообщений о прогрессе во время инициализации таблицы (Юши Огивара, Тацуо Ишии, Фудзии Масаао) § §
Сделано pg_controldata более устойчивым к поврежденным файлам
pg_control
(Ильясов Ян, Антон Волошин) §Поскольку pg_controldata будет пытаться вывести содержимое
pg_control
, даже если проверка CRC не пройдена, необходимо позаботиться о том, чтобы не возникало некорректного поведения при недопустимых значениях полей. Этот патч исправляет некоторые проблемы, вызванные недопустимыми временными метками и, по-видимому, отрицательными размерами сегментов WAL.Исправлена возможная ошибка в pg_dump с последовательностями идентификаторов, прикрепленными к таблицам, которые являются членами расширения (Tom Lane) §
Исправлена утечка памяти в pg_restore с данными, сжатыми с помощью zstd (Tom Lane) §
Утечка была на операцию декомпрессии, поэтому была бы наиболее заметна при дампе, содержащем много таблиц или больших объектов.
Исправлено pg_basebackup для корректной обработки файлов
pg_wal.tar
, превышающих 2 ГБ, в Windows (Davinder Singh, Thomas Munro) § §Использованы тела функций стандарта SQL в объявлениях SQL-языковых функций
contrib/earthdistance
(Том Лейн, Ронан Данкло) §Это изменение позволяет их ссылки на
contrib/cube
разрешаться во время создания расширения, снижая риск сбоев, основанных на пути поиска, и возможных атак.В частности, это восстановило их пригодность в таких контекстах, как сгенерированные столбцы, для которых PostgreSQL v17 ограничил путь поиска по соображениям безопасности. Мы получили сообщения о том, что базы данных не удалось обновить до v17 из-за этого. Этот патч был включен в v16, чтобы предоставить обходной путь: обновление расширения
earthdistance
до этой версии заранее должно позволить успешное обновление.Обновлены конфигурационные проверки, которые определяют переключатели компилятора, необходимые для доступа к инструкциям ARM CRC (Том Лейн) §
На платформах ARM, где базовая целевая CPU не имеет инструкций CRC, необходимо предоставить переключатель
-march
, чтобы убедить компилятор скомпилировать такие инструкции. В последних версиях gcc отклоняется значение, которое мы пытались использовать, что приводит к тихому возврату к программному CRC.Исправлена система сборки meson для поддержки старых библиотек OpenSSL на Windows (Darek Slusarczyk) §
Добавлена поддержка устаревших имен библиотек
ssleay32
иlibeay32
.В сборках Windows с использованием meson, обеспечено экспортирование всех функций libcommon и libpgport (Владлен Пополитов, Хейкки Линнакангас) § §
Это исправляет ошибки сборки “неразрешенный внешний символ” для расширений.
Исправлен процесс конфигурации meson для правильного обнаружения заголовочного файла OSSP
uuid.h
под MSVC (Эндрю Данстан) §При сборке с использованием meson,
pgevent
установлен вpkglibdir
, а не вbindir
(Петер Айзентраут) §Это соответствует поведению системы сборки на основе make и старой системы сборки MSVC.
При сборке с использованием meson, файл
sepgsql.sql
был установлен вshare/contrib/
вместоshare/extension/
(Петер Айзентраут) §Это соответствует тому, что делается в системе сборки на основе make.
Обновлены файлы данных часовых поясов до tzdata выпуска 2025a для изменений закона о летнем времени в Парагвае, а также исторические исправления для Филиппин (Tom Lane) §