E.19. Выпуск 15.11#

E.19. Выпуск 15.11

E.19. Выпуск 15.11

Дата релиза:  2025-02-13

Этот выпуск содержит различные исправления из версии 15.10. Для получения информации о новых функциях в основном выпуске 15, см. Раздел E.30.

E.19.1. Миграция на версию 15.11

Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.

Однако, если обновление выполнялось с версии ранее 15.9, см. Раздел E.21.

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

  • Усилены PQescapeString и связанные функции против неправильно закодированных входных строк (Андрес Фройнд, Ноа Миш) § § § § § §

    Функции цитирования данных, предоставленные libpq, теперь полностью проверяют корректность кодировки их ввода. Если обнаружены недопустимые символы, они сообщают об ошибке, если это возможно. Для тех, у которых отсутствует соглашение о возврате ошибки, выходная строка корректируется, чтобы гарантировать, что сервер сообщит о недопустимой кодировке, и никакая промежуточная обработка не будет введена в заблуждение байтами, которые могут случайно совпадать с одинарной кавычкой, обратной косой чертой и т. д.

    Цель этого изменения заключалась в защите от атак с использованием SQL-инъекций, которые были возможны, если одна из этих функций использовалась для экранирования специально подготовленного ввода. Опасности не было, когда результирующая строка отправлялась непосредственно на сервер PostgreSQL (который в любом случае проверял бы ее кодировку), но существовал риск, когда она передавалась через psql или другой клиентский код. Исторически сложилось так, что такой код не тщательно проверял кодировку, и во многих случаях не было ясно, что он должен был бы делать, если бы обнаружил такую проблему.

    Это исправление эффективно только в том случае, если функция экранирования данных, сервер и любое промежуточное обработка согласны с используемой кодировкой символов. Приложения, которые вставляют ненадежный ввод в SQL-команды, должны особенно тщательно следить за тем, чтобы это было так.

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

    Проект PostgreSQL благодарит Стивена Фьюэра за сообщение об этой проблеме. (CVE-2025-1094)

  • Исключены параллельные рабочие из проверок привилегий подключения и ограничений (Tom Lane) §

    Не проверялись datallowconn, rolcanlogin и привилегии ACL_CONNECT при запуске параллельного рабочего процесса, вместо этого предполагалось, что достаточно, чтобы ведущий процесс изначально прошел аналогичные проверки. Это избегало, например, неожиданных сбоев параллельных запросов, когда ведущий процесс выполнялся от имени роли, не имеющей привилегии входа. В том же духе, ограничения ReservedConnections, datconnlimit и rolconnlimit применялись только к обычным бэкендам, и учитывались только обычные бэкенды при проверке, достигнуты ли уже ограничения. Эти ограничения предназначены для предотвращения чрезмерного использования слотов процессов для обычных бэкендов — но параллельные рабочие процессы и другие специальные процессы имеют свои собственные пулы слотов процессов с собственными проверками ограничений.

  • Исправлено возможное повторное использование устаревших результатов в оконных агрегатах (Дэвид Роули) §

    Оконный агрегат с оптимизацией условия выполнения и типом результата с передачей по ссылке мог неправильно возвращать результат из предыдущего раздела вместо выполнения нового вычисления.

  • Синхронизировано TransactionXmin с MyProc->xmin (Heikki Linnakangas) §

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

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

    Это могло привести, например, к невозможности использования вновь созданной функции в существующей сессии.

  • Предотвращено возможное повреждение каталога, когда системный каталог очищался одновременно с обновлением (Ноа Миш) §

  • Исправлена порча данных при сбое усечения отношения (Томас Монро) § § §

    Вызовы файловой системы, необходимые для выполнения усечения отношений, могли завершиться сбоем, оставляя несогласованное состояние на диске (например, фактически восстанавливая удаленные данные). Мы не можем действительно предотвратить это, но мы можем восстановиться, превращая такие сбои в PANIC, так что согласованность восстанавливается путем воспроизведения из WAL до момента непосредственно перед попыткой усечения. Это не является очень желательным поведением, но такие сбои достаточно редки, чтобы это казалось приемлемым решением.

  • Предотвращено начало контрольных точек во время усечения отношений (Роберт Хаас) §

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

  • Использовалась rename() вместо link()/unlink() для переименования файлов (Натан Боссарт) §

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

  • Избегалось возможное потеря обновления pg_database.datfrozenxid когда VACUUM выполнялся одновременно с REASSIGN OWNED, который изменял владельца этой базы данных (Кирилл Решке) §

  • Исправлены некорректные значения tg_updatedcols, передаваемые в AFTER UPDATE триггеры (Tom Lane) §

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

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

  • Исправлено отсоединение раздела, который имеет собственное ограничение внешнего ключа, ссылающееся на разделенную таблицу (Amul Sul) §

    В общих случаях внешние ключи определены на верхнем уровне секционированной таблицы; но если вместо этого один определен на секции и ссылается на секционированную таблицу, и ссылающаяся секция отсоединена, соответствующие записи pg_constraint были обновлены неправильно. Это приводило к ошибкам типа не удалось найти триггеры проверки ON INSERT ограничения внешнего ключа.

  • Исправлена неправильная обработка кодов формата FFn в to_timestamp (Tom Lane) §

    Код формата целого числа, непосредственно предшествующий FFn, потребовал бы все доступные цифры, не оставив ни одной для FFn.

  • При обратной обработке выражения XMLTABLE() убедитесь, что имена пространств имен XML заключены в двойные кавычки, когда это необходимо (Дин Рашид) §

  • Включена опция ldapscheme в выводе pg_hba_file_rules() (Лауренц Альбе) § §

  • Не объединены операции UNION, если их колляции столбцов не согласованы (Tom Lane) §

    Ранее игнорировались сопоставления при принятии решения о том, безопасно ли объединять шаги UNION в одну N-стороннюю операцию UNION. Это было, возможно, допустимо до введения недетерминированных сопоставлений, но теперь это не так, поскольку используемое сопоставление может повлиять на определение уникальности.

  • Исправлена пропущенная обработка выражений для шагов обрезки разделов (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, чтобы предотвратить сбой при удалении семейства, имеющего висячие члены.

  • Исправлены множественные утечки памяти в выводе логического декодирования (Виньеш С, Масахико Савада, Бою Ян) § § §

  • Избегать маловероятного сбоя из-за нехватки памяти, из-за отсутствия проверки на неудачный возврат из malloc() (Карина Лицкевич) §

  • Избежано переполнения целого числа при проверке условия 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 по умолчанию.

  • Исправлена обработка точек соединения Windows, которые не имеют происхождения от PostgreSQL (Томас Мунро) § §

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

  • Исправлена ошибка утверждения в запросах WITH RECURSIVE ... UNION (Дэвид Роули) §

  • Избежано сбоя утверждения при разборе правила, если запрос листа операции множества содержит операции множества (Man Zeng, Tom Lane) §

  • Избежано сбоя утверждения в крайних случаях при запуске параллельного запроса (Tom Lane) §

  • Исправлена ошибка утверждения при завершении работы при записи файла статистики (Майкл Пакье) §

  • В NULLIF() избегалось передавать указатель на расширенный объект с правом записи в функцию равенства типа данных (Tom Lane) §

    Функция равенства могла бы изменить или удалить объект, если бы ей был передан указатель на запись, что было бы плохо, если решено вернуть его в качестве результата 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_basebackup для корректной обработки файлов pg_wal.tar, превышающих 2 ГБ, на Windows (Davinder Singh, Thomas Munro) § §

  • Обновлены конфигурационные пробы, которые определяют переключатели компилятора, необходимые для доступа к инструкциям ARM CRC (Том Лейн) §

    На платформах ARM, где базовая целевая CPU не имеет инструкций CRC, необходимо предоставить переключатель -march, чтобы убедить компилятор скомпилировать такие инструкции. В последних версиях gcc отклоняется значение, которое мы пытались использовать, что приводит к тихому возврату к программному CRC.

  • Во время configure, если обнаружен компилятор C23, попытаться запросить C17 (Томас Мунро) §

    PostgreSQL версии до v16 не будут компилироваться по правилам C23. Если выбранный компилятор по умолчанию использует C23 или более позднюю версию, попробуйте добавить переключатель -std=gnu17, чтобы изменить это. (Если это не сработает для вашего компилятора, вручную укажите CFLAGS с подходящим переключателем.)

  • Обновлены файлы данных часовых поясов до tzdata выпуска 2025a для изменений закона о летнем времени в Парагвае, а также исторические исправления для Филиппин (Tom Lane) §