E.31. Выпуск 9.5.14

Дата выпуска: 2018-08-09

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

E.31.1. Миграция на версию 9.5.14

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

Однако если вы обновляете сервер с более ранней версии, чем 9.5.13, см. Раздел E.35.

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

  • Осуществление полного сброса состояния libpq между попытками соединения (Том Лейн)

    Непривилегированный пользователь dblink или postgres_fdw мог обойти проверки, предназначенные для предотвращения использования учётных данных на стороне сервера, например, файла ~/.pgpass, принадлежащего пользователю ОС, от имени которого работает сервер. В частности, уязвимость затрагивает серверы, принимающие локальные подключения с методом peer. Возможны были и другие атаки, например, SQL-инъекции в сеансе postgres_fdw. Для атаки на postgres_fdw через эту уязвимость пользователь должен был иметь возможность создавать объект стороннего сервера с нужными параметрами подключения, но атаку на dblink мог произвести любой пользователь, имеющий к нему доступ. Вообще любой пользователь, имеющий возможность менять параметры подключения для приложения на базе libpq, мог производить непредусмотренные действия, но другие эффективные сценарии эксплуатации этого сложно придумать. Мы благодарим Андрея Красичкова за сообщение о данном дефекте. (CVE-2018-10915)

  • Исправление поведения INSERT ... ON CONFLICT UPDATE с более сложным представлением, чем просто SELECT * FROM ... (Дин Рашид, Амит Ланготе)

    Ошибочное развёртывание изменяемого представления могло приводить к сбоям или ошибкам «attribute ... has the wrong type» (атрибут ... имеет неверный тип), если список SELECT представления не соответствовал в точности списку столбцов нижележащей таблицы. Более того, развив атаку через эту уязвимость, злоумышленник мог изменять столбцы, не имея для них права UPDATE, но имея права INSERT и UPDATE для некоторых других столбцов в таблице. Любой пользователь также мог эксплуатировать её для раскрытия содержимого памяти сервера. (CVE-2018-10925)

  • Обеспечение своевременного изменения полей relfrozenxid и relminmxid в «зафиксированных» системных каталогах (Андрес Фройнд)

    Из-за чрезмерно оптимистичного кеширования эти изменения могли оказаться невидимыми для других сеансов, что приводило к случайным ошибкам и/или разрушению данных. Для общих каталогов, таких как pg_authid, проблема была ещё острее, так как устаревшие кешированные данные могли попадать в новые сеансы и оставаться в существующих.

  • Исправление поведения в ситуации, когда недавно повышенный сервер аварийно завершается до окончания обработки первой контрольной точки после восстановления (Микаэль Пакье, Кётаро Хоригути, Паван Деоласи, Альваро Эррера)

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

  • Исключение выдачи фантомной записи WAL при переработке полностью нулевой страницы индекса btree (Амит Капила)

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

  • При воспроизведении WAL добавлена защита от некорректной длины записи, превышающей 1 ГБ (Микаэль Пакье)

    Подобные данные должны считаться некорректными. Ранее код пытался выделить такой объём и получал критическую ошибку, что делало восстановление невозможным.

  • При завершении восстановления запись в файл истории линии времени должна откладываться, насколько это возможно (Хейкки Линнакангас)

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

  • Увеличение скорости воспроизведения WAL для транзакций, удаляющих множество отношений (Фудзии Масао)

    В результате этого изменения уменьшается число сканирований общих буферов, поэтому эффект от данного изменения тем больше, чем больше значение shared_buffers.

  • Увеличение скорости освобождения блокировки при воспроизведении WAL ведомым сервером (Томас Мунро)

  • Обеспечение согласованной передачи состояния логической трансляции передатчиками WAL (Саймон Риггс, Савада Масахико)

    Ранее код не мог правильно определить, удалось ли нагнать вышестоящий сервер.

  • Устранение дефектов в процедуре обработки снимков при логическом декодировании, приводивших к ошибкам декодирования в редких случаях (Арсений Шер, Альваро Эррера)

  • Обеспечение корректного сброса кешированного списка индексов таблицы после сбоя при создании индекса (Питер Гейган)

    Ранее в этом списке могли оставаться OID нерабочих индексов, что могло приводить к проблемам в том же сеансе.

  • Исправление некорректной обработки пустых несжатых страниц списка идентификаторов в индексах GIN (Шивасубраманьян Рамасубраманьян, Александр Коротков)

    Это могло привести к сбою проверочного утверждения после выполнения pg_upgrade для индексов GIN версии до 9.4 (в 9.4 и последующих версиях такие страницы не создаются).

  • Обеспечение реакции на сигналы в процессе VACUUM в цикле удаления страниц B-дерева (Андрес Фройнд)

    С испорченными индексами btree цикл мог оказаться бесконечным, и прервать его можно было только аварийно отключив сервер.

  • Исправление некорректной оптимизации классов эквивалентности со столбцами составного типа (Том Лейн)

    Вследствие данной ошибки сервер не понимал, что индекс по составному столбцу может обеспечить порядок сортировки, необходимый для соединения слиянием с данным столбцом.

  • Исправление синтаксиса конструкции SQL-стандарта FETCH FIRST, чтобы она принимала ($n), как того требует стандарт (Эндрю Гирт)

  • Корректное добавление схемы к именам ряда объектов в выводе getObjectDescription (Кётаро Хоригути, Том Лейн)

    Имена правил сортировки, преобразований и объектов текстового поиска не дополнялись схемой, тогда как должны были.

  • Расширение счётчика строк в команде COPY FROM с 32 до 64 бит (Дэвид Роули)

    Тем самым были решены две проблемы с входными данными, содержащими более 4G строк: COPY FROM WITH HEADER терял одну строку на каждые 4G строк (не только первую), а в сообщениях об ошибках выводилось неверное количество строк.

  • Добавление в библиотеку ecpg pgtypes функции освобождения строк для исключения проблем с управлением памятью в разных модулях (Такаюки Цунакава)

    В Windows могут происходить сбои, если вызов free для некоторого блока памяти производится не из той DLL, которая выделила память (с помощью malloc). Библиотека pgtypes иногда возвращает строки, которые должен освободить вызывающий код, и сделать это корректно оказывается невозможно. Добавленная функция PGTYPESchar_free() является просто обёрткой free, позволяющей приложениям произвести освобождение по правилам.

  • Исправление поддержки в ecpg переменных long long в Windows, а также на других платформах, где strtoll/strtoull объявлены нестандартно или не объявлены вовсе (Хыонг Дангминь, Том Лейн)

  • Исправление ошибки с определением типа SQL-оператора в PL/pgSQL, когда изменение правила приводило к изменению семантики оператора в рамках сеанса (Том Лейн)

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

  • Исправление запроса пароля в клиентских программах, чтобы отображение корректно отключалось в Windows, когда stdin — не терминал (Мэтью Стикни)

  • Продолжение исправления некорректного заключения в кавычки значений для переменных GUC со списками при формировании дампа (Том Лейн)

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

  • В pg_dump устранено упущение, когда свойства REPLICA IDENTITY для индексов ограничений не выгружались (Том Лейн)

    Уникальные индексы, созданные вручную, помечались корректно, а индексы, созданные ограничениями UNIQUE или PRIMARY KEY — нет.

  • В pg_upgrade теперь правильно проверяется, что старый сервер был выключен штатно (Брюс Момджян)

    Ранее проверка могла сработать некорректно при выключении сервера в незамедлительном режиме.

  • Исправление в contrib/hstore_plperl просмотра скалярных ссылок Perl и предотвращение сбоя в случае, если не удаётся найти хеш-ссылку там, где она ожидается (Том Лейн)

  • Устранение сбоя в функции модуля contrib/ltree при получении на вход пустого массива (Пьер Дюкроке)

  • Исправление обработки ошибок в ряде мест, где мог выдаваться некорректный код ошибки (Микаэль Пакье, Том Лейн, Магнус Хагандер)

  • Переоформление скриптов Makefile для обеспечения компоновки программ с собранными в том же дереве библиотеками (например, libpq.so), а не с теми, что могут уже находиться в системных каталогах библиотек (Том Лейн)

    Это позволяет избежать проблем при сборке на платформах, где представлены старые версии библиотек PostgreSQL.

  • Обновление данных часовых поясов до версии tzdata 2018e, включающее изменение правил перехода на летнее время в Северной Корее, а также корректировку исторических данных для Чехословакии.

    В это обновление вошло переопределение «летнего времени», которое действует в Ирландии, а также действовало в прошлом в Намибии и в Чехословакии. В этих юрисдикциях стандартное время действует летом, а время для экономии света — зимой, поэтому при переходе на это время сдвиг производится на час назад, а не на час вперёд. Это не влияет ни на фактическое смещение от UTC, ни на используемое сокращение часового пояса; эта особенность проявляется лишь в том, что в таких случаях столбец is_dst в представлении pg_timezone_names будет содержать true для зимнего периода, и false для летнего.