E.21. Выпуск 9.6.4
Дата выпуска: 2017-08-10
В этот выпуск вошли различные исправления, внесённые после версии 9.6.3. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.25.
E.21.1. Миграция на версию 9.6.4
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы используете сторонние серверы данных, на которых для проверки подлинности применяются пароли, прочитайте ниже первую запись в списке изменений.
Также, если вы обновляете сервер с версии, более ранней, чем 9.6.3, см. Раздел E.22.
E.21.2. Изменения
Дальнейшее ограничение видимости
pg_user_mappings
.umoptions
для защиты паролей, сохранённых в свойствах сопоставлений пользователей (Ной Миш)Исправление дефекта CVE-2017-7486 оказалось некорректным: в результате пользователь мог видеть свойства своего собственного сопоставления, даже когда он не имел права
USAGE
для соответствующего стороннего сервера. В таких свойствах мог содержаться пароль, который должен задавать владелец сервера, а не сам пользователь. Так как представлениеinformation_schema.user_mapping_options
не показывает свойства в таких случаях, иpg_user_mappings
не должно. (CVE-2017-7547)Само по себе это исправление корректирует поведение только в новых базах данных, создаваемых initdb. Если вы хотите применить это исправление к существующей базе данных, вам нужно будет проделать следующие действия:
Добавьте
allow_system_table_mods = true
вpostgresql.conf
и перезапустите сервер. (В версиях, поддерживающихALTER SYSTEM
, вы можете воспользоваться этой командой для изменения конфигурации, но перезапустить сервер потребуется всё равно.)В каждой базе данных кластера выполните от имени суперпользователя следующие команды:
SET search_path = pg_catalog; CREATE OR REPLACE VIEW pg_user_mappings AS SELECT U.oid AS umid, S.oid AS srvid, S.srvname AS srvname, U.umuser AS umuser, CASE WHEN U.umuser = 0 THEN 'public' ELSE A.rolname END AS usename, CASE WHEN (U.umuser <> 0 AND A.rolname = current_user AND (pg_has_role(S.srvowner, 'USAGE') OR has_server_privilege(S.oid, 'USAGE'))) OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE')) OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN U.umoptions ELSE NULL END AS umoptions FROM pg_user_mapping U LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN pg_foreign_server S ON (U.umserver = S.oid);
Не забудьте внести коррективы в базах данных
template0
иtemplate1
, в противном случае уязвимость сохранится в базах, которые будут создаваться впоследствии. Чтобы поправитьtemplate0
, вам потребуется временно разрешить подключения к ней. В PostgreSQL 9.5 и новее вы можете выполнитьALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
, а внеся поправку в
template0
, восстановить прежнее состояние командойALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
В более ранних версиях вместо этого используйте пару команд
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0'; UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
В заключение удалите параметр конфигурации
allow_system_table_mods
и ещё раз перезапустите postmaster.
Запрет пустых паролей для всех методов аутентификации по паролю (Хейкки Линнакангас)
Библиотека libpq игнорирует пустое указание пароля и не передаёт его на сервер. Поэтому, если пароль пользователя пустой, psql и другие клиенты на базе libpq не позволяют подключиться с таким паролем. Как следствие, администратор может решить, что установка пустого пароля равнозначна запрету входа по паролю. Однако с изменённым клиентом или клиентом не на базе libpq подключение оказывается возможным, в зависимости от настроенного метода аутентификации. В частности, самый распространённый метод,
md5
, принимает пустые пароли. В результате этого изменения сервер не будет принимать пустые пароли во всех случаях. (CVE-2017-7546)Добавление в
lo_put()
проверки праваUPDATE
для целевых больших объектов (Том Лейн, Микаэль Пакье)Функция
lo_put()
, несомненно, должна требовать наличия тех же прав, что иlowrite()
, но такая проверка отсутствовала, что позволяло пользователю менять данные в большом объекте. (CVE-2017-7548)Исправление в документации описания процесса обновления резервных серверов с использованием pg_upgrade (Брюс Момджян)
Ранее в документации говорилось, что нужно запустить/остановить ведущий сервер после запуска pg_upgrade, но до синхронизации резервных серверов. Однако эта последовательность небезопасна.
Исправление одновременной блокировки цепочки изменённых кортежей (Альваро Эррера)
Когда цепочка изменённых кортежей блокируется одновременно несколькими сеансами в неконфликтующем режиме с использованием старого снимка, и все операции завершаются успешно, существовала возможность, что некоторые из них, несмотря на это, нарушатся (и заключат, что актуальной версии кортежа нет) из-за условий гонки. В частности, вследствие этого проверка внешнего ключа могла не увидеть кортеж, который определённо существует, но изменяется параллельной операцией.
Устранение риска повреждения данных при замораживании кортежа, в котором XMAX равен идентификатору мультитранзакции с ровно одним ещё востребованным членом (Фёдор Сигаев)
Предупреждение целочисленного переполнения и краха при сортировке в памяти более чем одного миллиарда кортежей (Сергей Копосов)
В Windows необходимо повторять попытки создания процесса в случае ошибки при резервировании диапазона адресов разделяемой памяти в новом процессе (Том Лейн, Амит Капила)
Это должно устранить периодические сбои при запуске дочерних процессов, возможно, вызванные вмешательством антивирусных программ.
Устранение маловероятной возможности повреждения разделяемой хеш-таблицы предикатных блокировок в сборках для Windows (Томас Манро, Том Лейн)
Предотвращение вывода в журнал сообщения о штатном закрытии SSL-соединения (поведение должно быть таким же, как и при сбросе соединения) (Микаэль Пакье)
Запрещение передачи сеансовых билетов SSL клиентам (Том Лейн)
Это исправление устраняет сбои при переподключении клиентов с реализациями SSL, в которых эти билеты используются.
Исправление кода, устанавливающего tcp_keepalives_idle в Solaris (Том Лейн)
Исправление дефекта в сборщике статистики, приводящего к потере запросных сообщений, выдаваемых сразу после перезапуска главного процесса (Том Лейн)
Запросы статистики, выдаваемые в течение полсекунды после предыдущего отключения главного процесса, по сути терялись.
Размер приёмного буфера в сборщике статистики должен быть не меньше 100 Кбайт (Том Лейн)
Это снижает риск потери данных статистики на старых платформах, где размер приёмного буфера по умолчанию меньше.
Устранение возможности создания некорректного сегмента WAL при повышении резервного сервера сразу после того, как он обрабатывает запись
XLOG_SWITCH
(Андрес Фройнд)Процесс walsender должен завершаться своевременно, когда клиент инициирует выключение (Том Лейн)
Исправление обработки сигналов SIGHUP и SIGUSR1 в процессах walsender (Петр Желинек, Андрес Фройнд)
Предотвращение панического состояния, которое могут вызвать процессы walsender во время контрольной точки при выключении (Андрес Фройнд, Микаэль Пакье)
Устранение неоправданной паузы при перезапуске процессов walreceiver, возникающей вследствие условий гонки в главном процессе (Том Лейн)
Устранение утечки маленьких подтранзакций, оказывающихся на диске при логическом декодировании (Андрес Фройнд)
В результате образовывались временные файлы, занимающие лишнее место на диске.
Оптимизация операций, необходимых для получения снимков при создании слотов логического декодирования (Андрес Фройнд, Петр Желинек)
Предыдущий алгоритм оказывался очень неэффективным на сервере со множеством открытых транзакций.
Устранение условий гонки, при которых создание слотов логического декодирования могло откладываться на неопределённое время (Андрес Фройнд, Петр Желинек)
Уменьшение издержек при обработке событий сброса системного кеша (Том Лейн)
Это особенно полезно для логического декодирования, когда сброс кеша происходит часто.
Ликвидация некорректной эвристики, применяемой в некоторых случаях для оценки избирательности соединения при наличии ограничений внешнего ключа (Дэвид Роули)
В некоторых случаях, когда существовал внешний ключ по нескольким столбцам, но он не точно соответствовал структуре условия соединения, планировщик использовал эвристическую оценку, которая оказывалась неподходящей. Теперь в таких случаях будет применяться та же логика, что была до версии 9.6.
Исправление поведения в ситуациях, когда
INSERT
илиUPDATE
присваивает более одного элемента столбцу с типом домена на базе массива (Том Лейн)Разрешение использования оконных функций во вложенных
SELECT
в аргументах агрегатной функции (Том Лейн)Обеспечение корректного применения предложения
CHECK OPTIONS
для представления, когда нижележащая таблица является сторонней (Эцуро Фудзита)Ранее операция изменения полностью передавалась на сторонний сервер, и если для представления задавалось ограничение, оно не проверялось.
Предупреждение конфликта имён с автоматически генерируемыми типами массивов при выполнении
ALTER ... RENAME
(Вик Фиринг)Ранее автоматически сгенерированный тип массива во избежание конфликта переименовывался при выполнении
CREATE
; данное исправление распространяет это поведение и на операции переименования.Устранение потери указателя в
ALTER TABLE
когда для ограничения, принадлежащего таблице, добавлен комментарий (Дэвид Роули)При повторном применении комментария к воссозданному ограничению мог произойти сбой со странным сообщением или даже с аварийным завершением.
Добавление для команды
ALTER USER ... SET
всех вариантов синтаксиса, что принимаетALTER ROLE ... SET
(Питер Эйзентраут)Допущение для сторонней таблицы создания ограничений
CHECK
в изначально непроверенном состоянии (NOT VALID
) (Амит Ланготе)CREATE TABLE
просто игнорирует указанияNOT VALID
для ограниченийCHECK
, исходя из того, что таблица должна быть пустой, и поэтому ограничение может сразу считаться проверенным. Но это неверно для командыCREATE FOREIGN TABLE
— нет причин полагать, что нижележащая таблица пуста, и даже если это так, не мы должны решать, что ограничение проверенное. Поэтому такую «оптимизацию» для сторонних таблиц нужно исключить.Обновление информации о зависимости при смене типа аргумента или возврата для функции ввода/вывода с
opaque
на целевой тип (Хейкки Линнакангас)CREATE TYPE
изменяет функции ввода/вывода, объявленные в давно устаревшем стиле, но информация о зависимости от этого типа не записывалась, в результате чего после командDROP TYPE
могли оставаться дефектные определения функций.Допущение распараллеливания в плане запроса, когда
COPY
копирует данные из его результата (Андрес Фройнд)Сокращение использования памяти при обработке командой
ANALYZE
столбцовtsvector
(Хейкки Линнакангас)Устранение ненужной потери точности и небрежного округления при умножении и делении значений
money
на целые числа или числа с плавающей точкой (Том Лейн)Уточнение проверок пробельных символов в функциях, разбирающих идентификаторы, например
regprocedurein()
(Том Лейн)В зависимости от используемой локали эти функции могли неправильно воспринимать фрагменты многобайтных символов как пробелы.
Использование уместных символов
#define
из Perl при сборке PL/Perl (Ашутош Шарма, Том Лейн)Это предупреждает проблемы переносимости, обычно проявляющиеся в виде ошибок «проверки совместимости» в момент загрузки библиотеки при использовании последних версий Perl.
Обеспечение в libpq корректного сброса состояния аутентификации GSS/SASL и SSPI после неудачной попытки подключения (Микаэль Пакье)
Ранее этот сброс не выполнялся и при переходе с SSL-соединения на не SSL ошибка GSS/SASL при попытке SSL-подключения мешала затем установить обычное подключение, без SSL. С SSPI этого не происходило, но имела место утечка памяти.
В psql устранён сбой, возникающий, когда команда
COPY FROM STDIN
завершалась вводом сигнала EOF с клавиатуры, а затем следовала ещё одна попытка выполнитьCOPY FROM STDIN
(Томас Манро)Это некорректное поведение наблюдалось в системах, основанных на BSD, (включая macOS), но не в других.
Исправление программ pg_dump и pg_restore, чтобы команды
REFRESH MATERIALIZED VIEW
выдавались в конце (Том Лейн)Это предотвращает ошибки при выгрузке/восстановлении данных, когда материализованное представление ссылается на таблицы, принадлежащие другому пользователю.
Улучшение вывода в pg_dump/pg_restore сообщений об ошибках, возникающих в zlib (Владимир Кунщиков, Альваро Эррера)
Исправление поведения pg_dump с ключом
--clean
, чтобы событийные триггеры удалялись должным образом (Том Лейн)Теперь также правильно назначаются владельцы событийных триггеров; ранее после запуска скрипта восстановления такие триггеры оказывались принадлежащими суперпользователю.
Исправление поведения pg_dump с ключом
--clean
, чтобы существование схемыpublic
не требовалось (Стивен Фрост)Исправление дефекта в pg_dump, когда для пустого класса операторов выдавался некорректный SQL (Даниэль Густафссон)
Исправление вывода pg_dump в stdout на платформе Windows (Кунтал Гхош)
Сжатые данные выгрузки в текстовом виде при выводе в stdout оказывались испорченными из-за того, что дескриптор файла не переводился в двоичный режим.
Исправление вывода
pg_get_ruledef()
для правилаON SELECT
, связанного с представлением, в котором переименовывались столбцы (Том Лейн)В некоторых особых случаях pg_dump использует
pg_get_ruledef()
для выгрузки представлений, так что эта ошибка могла приводить к сбоям при выгрузке/загрузке.Исправление выгрузки внешних соединений с пустыми ограничениями, получающихся, например, в результате
NATURAL LEFT JOIN
без общих столбцов (Том Лейн)Исправление выгрузки выражений с функциями в предложении
FROM
в случаях, когда эти выражения не преобразуются в нечто, напоминающее вызов функции (Том Лейн)Исправление вывода pg_basebackup в stdout на платформе Windows (Харибабу Комми)
Архивируемые данные при выводе в stdout оказывались испорченными из-за того, что дескриптор файла не переводился в двоичный режим.
Исправление pg_rewind для корректной работы с файлами больше 2 ГБ (Кунтал Гхош, Микаэль Пакье)
Обычно такие файлы в каталогах данных PostgreSQL не образуются, но в некоторых случаях они могут появиться.
Исправление pg_upgrade, чтобы в конечной записи в WAL не оказалось wal_level =
minimum
(Брюс Момджян)Это могло препятствовать переподключению обновлённых резервных серверов.
Исправление в pg_xlogdump вычисления длины записи WAL (Андрес Фройнд)
В
postgres_fdw
соединения к удалённым серверам должны устанавливаться заново после командALTER SERVER
иALTER USER MAPPING
(Кётаро Хоригути)Благодаря этому изменения параметров, затрагивающие свойства соединения, вступят в силу своевременно.
В
postgres_fdw
реализована отмена команд управления удалёнными транзакциями (Роберт Хаас, Рафия Сабих)Это изменение позволяет быстрее прервать ожидание неотвечающего удалённого сервера в большем количестве случаев, чем раньше.
Увеличение
MAX_SYSCACHE_CALLBACKS
для выделения дополнительного места расширениям (Том Лейн)При сборке разделяемых библиотек с gcc всегда должен передаваться ключ
-fPIC
, а не-fpic
(Том Лейн)Это позволяет поддерживать библиотеки расширений большего размера на тех платформах, где эти ключи не равнозначны.
Для сборок MSVC реализована обработка ситуации, когда библиотека openssl находится не в подкаталоге
VC
(Эндрю Дунстан)Для сборок MSVC добавлен нужный путь для заголовочных файлов libxml2 (Эндрю Дунстан)
Это устраняет прежнюю необходимость перемещения файлов в стандартной инсталляции libxml2 в Windows.
Сборки MSVC должны распознавать библиотеку Tcl с именем
tcl86.lib
(Ной Миш)В сборках MSVC должны учитываться флаги в параметре
PROVE_FLAGS
, заданном в командной строкеvcregress.pl
(Эндрю Дунстан)