E.4. Выпуск 17.3#

E.4. Выпуск 17.3

E.4. Выпуск 17.3 #

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

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

E.4.1. Миграция на версию 17.3 #

Дамп/восстановление не требуется для тех, кто использует 17.X.

Однако, если обновление выполняется с версии ранее 17.1, см. Раздел E.6.

E.4.2. Изменения #

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

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

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

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

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

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

  • Восстановлено автоматическое усечение имен баз данных и пользователей, появляющихся в запросах на подключение (Натан Боссарт) §

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

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

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

  • Убран суффикс Lock из названий событий ожидания LWLock (Бертран Друво) §

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

  • Исправлена возможная ошибка возврата всех совпадающих кортежей для сканирования индекса btree с условием ScalarArrayOp (= ANY) (Питер Геогеган) §

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

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

  • Держать TransactionXmin в синхронизации с MyProc->xmin (Хейки Линкангас) §

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Исправлена поддержка pg_get_constraintdef для NOT NULL ограничений на доменах (Álvaro Herrera) §

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

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

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

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

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

  • Исправлено планирование предварительно отсортированных операций UNION для случаев, когда типы данных входных столбцов не совпадают (Дэвид Роули) §

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

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

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

  • Предотвращены ошибки планировщика wrong varnullingrels после вытягивания подзапроса, который находится под внешним соединением (Tom Lane) § §

  • Игнорировались биты маркера обнуления отношений при поиске статистики (Ричард Гуо) §

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

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

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

  • Выделен собственный слот процесса для процесса slotsync worker (Том Лейн, Хоу Чжицзе) §

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

  • Разрешено таблицам dshash увеличиваться более чем на 1 ГБ (Маттиас ван де Меент) §

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

  • Избежано возможного переполнения целого числа в bringetbitmap() (Джеймс Хантер, Евгений Горбанёв) §

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

  • Исправлено неправильное вычисление номеров банков SLRU (Юра Соколов) §

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

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

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

  • Предотвращено бесконечное зацикливание серверов резервного копирования при потоковой передаче при чтении записи WAL, которая пересекает страницы (Киотаро Хоригучи, Александр Кукушкин) §

    Это происходило, когда продолжение записи находилось на странице, которую нужно было прочитать из другого источника WAL.

  • Исправлено непреднамеренное повышение ошибок FATAL до PANIC во время раннего запуска процесса (Ноа Миш) §

    Это исправляет некоторые маловероятные случаи, которые могли бы привести к PANIC: proc_exit() вызван в дочернем процессе.

  • Исправлены случаи, когда оператор или поддерживающая процедура члена семейства операторов могли стать висячей ссылкой (Tom Lane) § §

    В некоторых случаях тип данных мог быть удалён, в то время как ссылки на его OID всё ещё оставались в pg_amop или pg_amproc. Хотя это не вызывало немедленных проблем, попытка удалить семейство операторов, которому он принадлежал, завершалась неудачей, и pg_dump создавал некорректный вывод при выгрузке семейства операторов. Это исправление привело к тому, что при создании и модификации семейств/классов операторов добавлялись необходимые записи зависимостей, чтобы удаление типа данных также удаляло любые зависимые элементы семейства операторов. Однако это не помогло уязвимым ранее существующим семействам операторов, поэтому также была добавлена временная мера в DROP OPERATOR FAMILY, чтобы предотвратить сбой при удалении семейства, имеющего висячие члены.

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

  • Исправлена небольшая утечка памяти при обновлении настроек application_name или cluster_name (Тофиг Алиев) §

  • Избегать сбоя, когда фоновый процесс пытается проверить новое значение synchronized_standby_slots (Álvaro Herrera) §

  • Избежано переполнения целого числа при проверке условия wal_skip_threshold (Том Лейн) §

    Транзакция, которая создала очень большое отношение, могла ошибочно решить обеспечить долговечность, копируя отношение в WAL вместо выполнения fsync, тем самым отрицая смысл wal_skip_threshold. (Это имеет значение только когда wal_level установлен на minimal, иначе копия в WAL все равно требуется.)

  • Исправлен небезопасный порядок операций во время поиска в кеше (Ноа Миш) §

    Единственным известным последствием было обычно безвредное предупреждение вы не владеете блокировкой типа ExclusiveLock во время GRANT TABLESPACE.

  • Избегалось потенциальное использование после освобождения в параллельной очистке (Vallimaharajan G, John Naylor) §

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

  • Исправлены возможные сбои не удалось разрешить имя при использовании JIT на старых платформах ARM (Томас Мунро) §

    Это могло произойти в результате несоответствия в настройке по умолчанию -moutline-atomics между gcc и clang. Известно, что по крайней мере Debian и Ubuntu поставляют компиляторы gcc и clang, которые нацелены на armv8-a, но различаются в использовании outline atomics по умолчанию.

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

  • Избежано сбоя утверждения при разборе правила, если запрос-лист операции множества содержит операции множества (Ман Зэн, Том Лейн) §

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

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

  • Избегались жалобы valgrind на код хеширования строк (Джон Нейлор) §

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

    Функция равенства могла бы изменить или удалить объект, если бы ей был передан указатель на запись, что было бы плохо, если решено вернуть его в качестве результата NULLIF(). Вероятно, нет проблем с какой-либо встроенной функцией равенства, но легко продемонстрировать сбой с функцией, закодированной на PL/pgSQL.

  • Убедиться, что предварительная обработка выражений была применена к значению по умолчанию null в INSERT (Tom Lane) §

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

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

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

  • Избегался сбой, если серверный процесс пытался итерировать по общей радиальной дереве, которую он не создавал (Масахико Савада) §

    В ядре PostgreSQL нет кода, который делает это, но расширение может пожелать.

  • Устранены утечки памяти в 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 обратной косой черте (\). Эти символы были повреждены нормализацией имени пути, что предотвращало доступ к файлам, имена которых включают такие символы.

  • Добавлено автодополнение вкладок в psql для COPY (MERGE INTO) (Jian He) §

  • Исправлено использование неправильной версии 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_restore с данными, сжатыми с помощью zstd (Tom Lane) §

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

  • Исправлено pg_basebackup для правильной обработки файлов pg_wal.tar, превышающих 2 ГБ, на Windows (Davinder Singh, Thomas Munro) § §

  • В декларациях SQL-функций contrib/earthdistance использовались тела функций в формате SQL-стандарта (Том Лейн, Ронан Данкло) §

    Это изменение позволяет их ссылки на contrib/cube разрешаться во время создания расширения, снижая риск сбоев, основанных на пути поиска, и возможных атак.

    В частности, это восстановило их пригодность в таких контекстах, как сгенерированные столбцы, для которых PostgreSQL v17 ограничил путь поиска по соображениям безопасности. Мы получили сообщения о том, что базы данных не удалось обновить до v17 из-за этого. Этот патч был включен в v16, чтобы предоставить обходной путь: обновление расширения earthdistance до этой версии заранее должно позволить успешное обновление.

  • Обнаружено несоответствие версии между SQL-декларациями contrib/pageinspect и базовой общей библиотекой (Томас Вондра) §

    Ранее такое несоответствие могло привести к сбою при вызове brin_page_items(). Вместо этого выбрасывается ошибка с рекомендацией обновить расширение.

  • При попытке отменить удаленный запрос в contrib/postgres_fdw, повторно отправлялся запрос на отмену несколько раз, если он, казалось, ничего не сделал (Tom Lane) §

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

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

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

  • Исправлена система сборки meson для поддержки старых библиотек OpenSSL на Windows (Дарек Слусарчек) §

    Добавлена поддержка устаревших имен библиотек ssleay32 и libeay32.

  • В сборках Windows с использованием meson, гарантируется экспорт всех функций libcommon и libpgport (Владлен Пополитов, Хейкки Линкангас) § §

    Это исправляет ошибки сборки неразрешенный внешний символ для расширений.

  • Исправлен процесс конфигурации meson для правильного обнаружения заголовочного файла OSSP uuid.h под MSVC (Andrew Dunstan) §

  • При сборке с использованием meson, pgevent был установлен в pkglibdir, а не в bindir (Петер Айзентраут) §

    Это соответствует поведению системы сборки на основе make и старой системы сборки MSVC.

  • При сборке с использованием meson, файл sepgsql.sql устанавливается в share/contrib/ вместо share/extension/ (Петер Айзентраут) §

    Это соответствует тому, что делается в системе сборки на основе make.

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