E.37. Выпуск 9.6.20
Дата выпуска: 2020-11-12
В этот выпуск вошли различные исправления, внесённые после версии 9.6.19. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
E.37.1. Миграция на версию 9.6.20
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы обновляете сервер с более ранней версии, чем 9.6.16, см. Раздел E.41.
E.37.2. Изменения
Запрещение конструкции
DECLARE CURSOR ... WITH HOLD
и вызова отложенных триггеров в выражениях индексов и запросов матпредставлений (Ной Миш)Устранённая уязвимость по сути позволяла выйти из защищённой среды, в которой выполняются «операции с ограничениями безопасности». Злоумышленник, имеющий право создания не временных SQL-объектов, мог воспользоваться этой уязвимостью для выполнения произвольного SQL-кода от имени суперпользователя.
Проект PostgreSQL благодарит Этьена Сталманса за сообщение об этой проблеме. (CVE-2020-25695)
Исправление обработки сложных параметров в строках подключений в программах pg_dump, pg_restore, clusterdb, reindexdb и vacuumdb (Том Лейн)
В аргументе
-d
программ pg_dump и pg_restore, а также в аргументе--maintenance-db
других перечисленных программ может задаваться «строка подключения», содержащая не просто имя базы данных, но и другие параметры подключений. В случаях, когда эти программы должны были устанавливать дополнительные соединения, например, для параллельной обработки или работы с несколькими базами, строка соединения терялась, и для дополнительных подключений использовались только основные параметры (адрес и порт сервера, имя базы данных и имя пользователя). Это могло приводить к сбоям подключений, если строка подключения дополнительно содержала существенную информацию, например, изменённые параметры SSL или GSS. Хуже того, успешно установленное соединение могло оказаться незашифрованным (тогда как должно было шифроваться) или подверженным атакам с посредником (которые предотвращались бы при использовании заданных параметров). (CVE-2020-25694)Обеспечение использования всех не переопределённых параметров из предыдущей строки соединения при выполнении команды psql
\connect
(Том Лейн)Это исправление предотвращает ошибки переподключения, которые могли раньше возникать из-за упущения значимых параметров, например, параметров SSL или GSS. Хуже того, раньше переподключение могло произойти успешно, но при этом оказаться незашифрованным (тогда как должно было шифроваться) или подверженным атакам с посредником (которые предотвращались бы при использовании заданных параметров). По большому счёту это та же проблема, что и описанная выше проблема pg_dump и др., но в случае psql ситуация усложняется тем, что пользователь может намеренно переопределить некоторые параметры соединений. (CVE-2020-25694)
Недопущение изменения командой psql
\gset
специальных переменных (Ной Миш)Команда
\gset
без префикса ранее переопределяла любые переменные по указанию сервера. Таким образом, скомпрометированный сервер мог установить переменную специального назначения, напримерPROMPT1
, в результате чего было возможно выполнение произвольного кода оболочки в сеансе пользователя.Проект PostgreSQL благодарит Ника Клитона за сообщение об этой проблеме. (CVE-2020-25696)
Предотвращение возможной потери данных при параллельном усечении журналов SLRU (Ной Миш)
Из-за этого редко проявлявшегося дефекта впоследствии могли выдаваться ошибки «apparent wraparound» (видимо, произошло зацикливание) или «could not access status of transaction» (не удалось получить состояние транзакции).
Обеспечение должного сохранения каталогов SLRU на диске во время контрольных точек (Томас Манро)
Тем самым предупреждается риск потери данных в случае последующего сбоя операционной системы.
Исправление поведения
ALTER ROLE
для пользователей, имеющих атрибутBYPASSRLS
(Том Лейн, Стивен Фрост)Атрибут
BYPASSRLS
у ролей могут изменять только суперпользователи, но другие действияALTER ROLE
, например смена пароля, должны разрешаться и непривилегированным пользователям с учётом обычных ограничений. Предыдущая реализация разрешала любые операции с ролью, имеющей такой атрибут, только суперпользователям.Исправление обработки выражений
CREATE TABLE LIKE
с наследованием (Том Лейн)Если команда
CREATE TABLE
использует и традиционное наследование, иLIKE
, ссылки на столбцы в ограниченияхCHECK
и выражениях индексов, приходящие из родительской таблицыLIKE
, могли быть неправильно пронумерованы, вследствие чего выдавались некорректные результаты или странные сообщения об ошибках. То же самое могло наблюдаться с генерируемыми выражениями (в тех версиях, где они поддерживаются).Исправление ошибки со сдвигом на один отрицательных значений, соответствующих годам до н. э. в функциях
to_date()
иto_timestamp()
(Дар Альатар-Йемен, Том Лейн)Кроме того, отрицательное значение года с явным указанием «BC» (до н. э.) теперь становится положительным, относящимся к н. э.
Обеспечение архивирования файлов истории линий времени вместе с WAL на ведомых серверах при выбранном в
archive_mode
режимеalways
(Григорий Смолкин, Фудзии Масао)Вследствие устранённого теперь упущения можно было лишиться возможности восстановления на момент времени (PITR).
Выполнение в процедуре отключения «smart» остановки фоновых процессов только после завершения всех клиентских сеансов (сеансов переднего плана) (Том Лейн)
С прежним поведением нарушалось выполнение параллельных запросов, так как управляющий процесс принудительно завершал процессы параллельных исполнителей и не запускал новые. Также при этом переставала работать автоочистка, что могло быть чревато большими проблемами, если продолжавшие существование клиентские сеансы вносили множество изменений данных.
Предупреждение переполнения стека при обработке сигналов в процессе postmaster (Том Лейн)
При активной параллельной обработке наблюдались сбои процесса postmaster по причине поступления слишком большого количества сигналов, запрашивающих создание параллельных исполнителей.
Недопущение вызова обработчиков atexit при выходе по сигналу SIGQUIT (Кётаро Хоригути, Том Лейн)
Большинство серверных процессов уже отказались от этой практики, но процесс архиватора по недосмотру сохранил старое поведение. Также неправильно завершались процессы, находившиеся в состоянии ожидания стартового клиентского пакета.
Предотвращение неправильной оптимизации ограничений подзапроса, обращающихся к группирующим столбцам, которые представляются константами (Том Лейн)
«Константный» выходной столбец подзапроса в действительности не будет константой, если это группирующий столбец, фигурирующий только в некоторых из наборов группирования.
Предупреждение сбоя в случаях, когда внедрённая SQL-функция меняет форму потенциально хешируемого выражения сравнения для подплана (Том Лейн)
Корректировка поведения в случае появления новых HOT-цепочек в ходе построения или перестроения индекса, когда одновременно происходит изменение данных (Анастасия Лубенникова, Альваро Эррера)
В результате устранённого теперь упущения могли выдаваться ошибки «failed to find parent tuple for heap-only tuple» (не удалось найти родительский кортеж для HOT-кортежа).
Обеспечение распаковки данных перед добавлением их в индекс BRIN (Томаш Вондра)
В элементах индексов не должны содержаться указатели на внешние данные TOAST, однако в реализации BRIN это не учли. Вследствие этого могли возникать ошибки «missing chunk number 0 for toast value NNN» (отсутствует порция номер 0 для TOAST-значения NNN). (Если вы столкнулись с такой ошибкой в существующем индексе, для устранения её должно быть достаточно выполнить
REINDEX
.)Корректировка обработки сброса обобщения в случае, когда он осуществляется одновременно со сканированием индекса BRIN (Александр Лахин, Альваро Эррера)
Ранее, если сброс обобщения зоны страниц происходил в неудачный момент времени, при сканировании индекса могла выдаваться ложная ошибка с сообщением о повреждении индекса.
Устранение редкой ошибки «lost saved point in index» (потеряна сохранённая точка в индексе) при сканировании составных индексов GIN (Том Лейн)
Устранение риска использования памяти после освобождения при отслеживании в событийном триггере операции
ALTER TABLE
(Жеан-Гийом де Рорте)Исправление некорректного сообщения об ошибке, выдаваемой при несовпадении типов движущегося агрегата (Джефф Джейнс)
Устранение блокировки при получении от параллельного исполнителя очень большого сообщения об ошибке (Вигнеш Си)
Избавление от неоправданной ошибки при передаче очень большого объёма данных через очереди в разделяемой памяти (Маркус Ваннер)
Устранение утечек памяти в кеше отношений при использовании политик RLS (Том Лейн)
Устранение небольшой утечки памяти при обработке сигнала SIGHUP, возникавшей с новыми значениями GUC-переменных, которые нельзя изменить без перезагрузки (Том Лейн)
Поддержка в libpq строк произвольной длины в файлах
.pgpass
(Том Лейн)Это прежде всего полезно, когда в качестве паролей сохраняются очень длинные защищённые ключи.
Отказ в libpq для Windows от вызовов
WSACleanup()
и сведение вызововWSAStartup()
к одному единственному для процесса (Том Лейн, Александр Лахин)Ранее libpq вызывала
WSAStartup()
при установлении каждого соединения, аWSACleanup()
— при закрытии соединения. Однако как оказалось, вызовWSACleanup()
может повлиять на другие операции программы, а именно, мы иногда наблюдали исчезновение ожидаемого вывода программы. По всей видимости, ликвидация этого вызова не должна иметь никаких побочных эффектов, поэтому он был удалён. (Это также способствует повышению производительности, если программа устанавливает множество подключений к серверу, так как она не будет постоянно загружать и выгружать DLL.)Исправление логики инициализации потоков в библиотеке ecpg для Windows (Том Лейн, Александр Лахин)
Из-за некорректной установки блокировок многопоточные приложения ecpg при редком стечении обстоятельств могли работать некорректно.
Смена в Windows режима чтения вывода команды «обратный апостроф» в psql с двоичного на текстовый (Том Лейн)
Благодаря этому будут корректно обрабатываться символы новой строки.
Включение в pg_dump сбора информации о столбцах в таблицах конфигурации расширений (Фабрицио де Ройес Мелло, Том Лейн)
Из-за отсутствия этой информации происходили сбои при загрузке данных таблицы, выгруженных с указанием
--inserts
или с неполными (хотя обычно корректными) командамиCOPY
.Добавление в pg_upgrade проверки существования каталогов табличных пространств в целевом кластере (Брюс Момджян)
Устранение возможности утечки памяти в
contrib/pgcrypto
(Микаэль Пакье)Добавление проверки на случай маловероятной ошибки во время выполнения в
contrib/pgcrypto
(Даниэль Густафссон)Использование
return
вместоexit()
в тестовых программах configure (Питер Эйзентраут)Это позволяет избежать проблем с некоторыми щепетильными компиляторами.
Обновление данных часовых поясов до версии tzdata 2020d, включающее изменение правил перехода на летнее время на Фиджи, в Марокко, Палестине, канадском Юконе, на острове Маккуори и на станции Кейси (Антарктика), а также корректировку исторических данных для Франции, Венгрии, Монако и Палестины.
Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией tzcode 2020d (Том Лейн)
С этой версией к нам попало изменение выбираемого по умолчанию формата вывода zic с «fat» (расширенный) на «slim» (минимальный). Для наших целей это не имеет практического значения, так как мы продолжаем использовать формат «fat» в версиях ниже 13. Также теперь гарантируется, что
strftime()
будет менять значениеerrno
, только если произойдёт ошибка.