E.41. Выпуск 10.9

Дата выпуска: 2019-06-20

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

E.41.1. Миграция на версию 10.9

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

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

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

  • Устранение возможности переполнения буфера при разборе верификатора SCRAM (Джонатан Кац, Хейкки Линнакангас, Микаэль Пакье)

    Любой прошедший проверку пользователь мог осуществить переполнение буфера в стеке, попытавшись сменить свой пароль на специально сконструированную строку. Помимо провоцирования сбоя PostgreSQL, этого могло быть достаточно для выполнения произвольного кода от имени пользователя ОС, запускающего PostgreSQL.

    Подобная возможность переполнения существовала в libpq, и эксплуатируя её, подставной сервер мог вызвать сбой клиентского приложения или, возможно, выполнить произвольный код от имени пользователя, запускавшего это приложение.

    Проект PostgreSQL благодарит Александра Лахина за сообщение об этой проблеме. (CVE-2019-10164)

  • Устранение сбоя команды ALTER TABLE ... ALTER COLUMN TYPE при наличии в таблице частичного ограничения-исключения (Том Лейн)

  • Ликвидация ошибки команды COMMENT при работе с комментариями ограничений доменов (Даниэль Густафссон, Микаэль Пакье)

  • Предотвращение возможного повреждения памяти в случае повторения столбцов в списке ключей хеша при агрегировании по хешу (Эндрю Гирт)

  • Исправление ошибочного построения планов с узлами MergeAppend (Том Лейн)

    Следствием этого дефекта могли быть сообщения об ошибках «could not find pathkey item to sort» (не удалось найти элемент ключа для сортировки).

  • Исправление ошибочного вывода запросов с повторяющимися именами соединений (Филипп Дюбе)

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

  • Исправление преобразования строковых значений JSON в выходные столбцы типа JSON в функциях json_to_record() и json_populate_record() (Том Лейн)

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

  • Исправление некорректной оптимизации квантификаторов {1,1} в регулярных выражениях (Том Лейн)

    Такие квантификаторы считались бесполезными и оптимизировались. Хотя в документации говорится, что они задают «жадное» поведение (или «нежадное» в случае «нежадной» вариации {1,1}?) для подвыражения, к которому они относятся, фактически они не действовали. Ошибка могла проявляться только с подвыражениями, содержащими группирующие скобки или обратные ссылки.

  • Устранение возможности ошибок при инициализации данных pg_stat_activity для нового процесса (Том Лейн)

    Ранее были возможны сбои определённых операций, выполняемых внутри критической секции, например, преобразования строк, извлечённых из сертификата SSL, в кодировку базы данных. В подобных случаях могло произойти глобальное зависание базы данных из-за нарушения протокола обращения к общим данным pg_stat_activity.

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

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

    Таким образом полностью исключены маловероятные случаи, когда процесс приёмника WAL завершался аварийно или зависал, получив команду на выключение.

  • Недопущение обращений к базам данных для проверки параметров в процессах, не подключённых к определённой базе данных (Вигнеш Си, Андрес Фройнд)

    Некорректные обращения могли вызывать ошибки вида «cannot read pg_class without having selected a database» (невозможно прочитать pg_class, не выбрав базу данных).

  • Предупреждение возможного зависания в libpq при использовании SSL, когда объём данных в буфере очереди OpenSSL оказывается кратным 256 байтам (Дэвид Биндерман)

  • Улучшение обработки в initdb нескольких равнозначных названий часового пояса системы (Том Лейн, Эндрю Гирт)

    Теперь initdb будет анализировать символическую ссылку /etc/localtime, если она существует, чтобы выбрать из всех равнозначных названий часового пояса системы наиболее подходящее. Таким образом при наличии нескольких названий часового пояса initdb скорее всего выберет именно то название, которое ожидает пользователь. Если же /etc/localtime не является символической ссылкой на файл данных часового пояса и часовой пояс не задан переменной окружения TZ, поведение initdb останется прежним.

    Кроме того, теперь UTC предпочитается другим названиям этого часового пояса, когда ни TZ, ни /etc/localtime не предлагают другой вариант. Тем самым устранено неудобство, возникшее после произошедшего в tzdata 2019a изменения, сделавшего названия часового пояса UCT и UTC равнозначными: initdb выбирал обозначение UCT, что не соответствовало ожиданиям пользователей.

  • Исправление порядка команд GRANT, выдаваемых программами pg_dump и pg_dumpall для баз данных и табличных пространств (Натан Боссарт, Микаэль Пакье)

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

  • Изменение варианта пересоздания секций в pg_dump — теперь будет выдаваться команда CREATE TABLE с последующей ATTACH PARTITION вместо использования указания PARTITION OF в команде создания таблицы (Альваро Эррера, Дэвид Роули)

    Таким образом устраняются проблемы, связанные с возможным изменением порядка столбцов в соответствии с родительской таблицей. Кроме того, секция теперь будет восстановлена из копии (в виде независимой таблицы), даже если её родительская таблица не восстановилась; при выполнении ATTACH произойдёт ошибка, но её можно просто игнорировать.

  • Устранение дезориентирующих сообщений об ошибках в reindexdb (Жюльен Руо)

  • Возвращение корректного состояния vacuumdb в случае ошибки при выполнении параллельных заданий (Жюльен Руо)

  • Исправление contrib/auto_explain для недопущения ошибок с параллельными запросами (Том Лейн)

    Ранее параллельный исполнитель мог попытаться передать на анализ свой запрос, тогда как родительский запрос в auto_explain не обрабатывался. Иногда это могло работать, хотя само по себе это неправильно, а в некоторых случаях выдавались ошибки вида «could not find key N in shm TOC» (не удалось найти ключ N в оглавлении общей памяти).

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

  • В contrib/postgres_fdw теперь учитываются возможные модификации данных, производимые локальными триггерами BEFORE ROW UPDATE (Сёхей Мотидзуки)

    Если триггер изменял столбец, который не затрагивался командой UPDATE, новое значение не передавалось на удалённый сервер.

  • Недопущение ошибки в Windows в случаях, когда для базы данных выбрана кодировка SQL_ASCII, а мы пытаемся вывести в журнал строку с не ASCII-символами (Ной Миш)

    В коде предполагалось, что такие строки всегда представлены в UTF-8, и если оказывалось, что это не так, происходила ошибка. Теперь же в журнал просто передаются непреобразованные байты.

  • Обеспечение совместимости заголовочных файлов PL/pgSQL с C++ (Георгий Тарасов)