发布日期:. 2025-02-13
本次发布包含来自 16.6 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.14。
加固 PQescapeString 及相关函数以防止无效编码的输入字符串 (Andres Freund,Noah Misch) § § § § § §
libpq 提供的数据引用函数现在会完全检查其输入的编码有效性。 如果检测到无效字符,会在可能的情况下报告错误。对于那些缺乏错误返回机制的函数, 会调整输出字符串以确保服务器将报告无效编码, 且中间处理过程不会被可能匹配单引号、反斜杠等的字节所欺骗。
此变更的目的是防止 SQL 注入攻击,当使用这些函数之一来引用精心构造的输入时, 这种攻击是可能的。当结果字符串直接发送到 PostgreSQL 服务器时并无风险(服务器本身也会检查编码), 但当它通过 psql 或其他客户端代码传递时存在风险。 历史上此类代码没有仔细检查编码,而且在很多情况下, 即使检测到此类问题,也不清楚应该如何处理。
此修复仅在数据引用函数、服务器和任何中间处理对所使用的字符编码达成一致时才有效。 将不受信任的输入插入 SQL 命令的应用程序应特别注意确保这一点。
不使用这些 libpq 函数而引用不受信任输入的应用程序和驱动程序 可能面临类似的问题风险。它们应首先确认数据在服务器期望的编码中是有效的。
PostgreSQL 项目感谢 Stephen Fewer 报告此问题。 (CVE-2025-1094)
将并行工作进程排除在连接权限检查和限制之外 (Tom Lane) §
在启动并行工作进程时不再检查 datallowconn、 rolcanlogin 和 ACL_CONNECT 权限, 而是假定领导进程最初已通过类似检查就足够了。这避免了例如当领导进程以缺少登录权限的角色运行时, 并行查询意外失败的问题。同样地,仅对常规后端执行 ReservedConnections、datconnlimit 和 rolconnlimit 限制,并且仅统计常规后端来检查是否已达到限制。 这些限制旨在防止常规后端过度消耗进程槽 --- 但并行工作进程和其他特殊进程 有自己的进程槽池和限制检查。
修复窗口聚合中可能重复使用过期结果的问题 (David Rowley) §
具有“运行条件”优化和传引用结果类型的窗口聚合, 可能错误地返回前一个分区的结果而不是执行新的计算。
保持 TransactionXmin 与 MyProc->xmin 同步(Heikki Linnakangas) §
此疏忽可能允许进程尝试访问已被清理掉的数据。一个已知的后果是 出现瞬时的 “could not access status of transaction” 错误。
修复可能导致未能将新插入的系统目录条目添加到系统目录缓存列表中的竞态条件 (Heikki Linnakangas) §
这可能导致例如在现有会话中无法使用新创建的函数。
防止当系统目录与更新操作并发清理时可能出现的系统目录损坏 (Noah Misch) §
修复关系截断失败时的数据损坏问题(Thomas Munro) § § §
执行关系截断所需的文件系统调用可能失败,在磁盘上留下不一致的状态 (例如,实际上恢复了已删除的数据)。我们无法真正阻止这种情况, 但可以通过将此类失败转为 PANIC 来恢复,这样就可以通过从 WAL 重放到尝试截断之前的状态来恢复一致性。这不是一个特别理想的行为, 但此类失败足够罕见,这似乎是一个可接受的解决方案。
防止在关系截断期间启动检查点 (Robert Haas) §
这避免了一种竞态条件,即修改后的文件可能在检查点完成之前未被 fsync, 如果操作系统在此后不久崩溃,则存在数据损坏的风险。
避免在 VACUUM 与更改该数据库所有者的 REASSIGN OWNED 并发运行时,可能丢失 pg_database.datfrozenxid 的更新(Kirill Reshke) §
修复传递给 AFTER UPDATE 触发器的不正确 tg_updatedcols 值(Tom Lane) §
在某些情况下,tg_updatedcols 位图可能描述的是 同一事务中较早命令更新的列集合,导致触发器执行错误的操作。
此外,防止因制作过多 tg_updatedcols 位图副本而导致的内存膨胀。
修复具有自己的外键约束引用分区表的分区在分离时的问题 (Amul Sul) §
通常情况下,外键定义在分区表的顶层;但如果外键是在分区上定义的, 并且引用了一个分区表,当该引用分区被分离时,相关的 pg_constraint 条目被错误地更新。这导致了诸如 “could not find ON INSERT check triggers of foreign key constraint” 之类的错误。
修复 to_timestamp 的 FF 格式代码的错误处理 (Tom Lane) §n
紧接在 FF 之前的整数格式代码会消耗所有可用数字, 导致 nFF 没有剩余数字可用。n
在反解析 XMLTABLE() 表达式时, 确保在必要时对 XML 命名空间名称进行双引号引用 (Dean Rasheed) §
当列排序规则不一致时,不要合并 UNION 操作 (Tom Lane) §
此前在判断是否可以安全地将 UNION 步骤合并为单个 N 路 UNION 操作时忽略了排序规则。 这在引入非确定性排序规则之前可以说是合理的,但现在不再如此, 因为使用的排序规则可以影响唯一性的定义。
防止在将位于外连接下方的子查询上拉后出现 “wrong varnullingrels” 规划器错误 (Tom Lane) § §
在查找统计信息时忽略 nulling-relation 标记位 (Richard Guo) §
此疏忽可能导致未能使用关于表达式的相关统计信息, 或出现 “corrupt MVNDistinct entry” 错误。
修复分区裁剪步骤中遗漏的表达式处理 (Tom Lane) §
此疏忽可能导致在访问分区表的查询中出现 “unrecognized node type” 错误,以及可能的其他问题。
允许 dshash 表增长超过 1GB(Matthias van de Meent) §
这避免了诸如 “invalid DSA memory alloc request size” 之类的错误。例如,在处理数百万张表的事务中可能出现这种情况。
避免 bringetbitmap() 中可能的整数溢出 (James Hunter,Evgeniy Gorbanyov) §
由于该结果仅用于统计目的,此错误的影响主要是表面上的。
确保已设置的进程锁存器不会阻止 postmaster 注意到套接字事件 (Thomas Munro) §
在后端启动工作进程和工作进程退出的极重工作负载下, 可能导致 postmaster 无法及时响应传入的客户端连接。
防止流复制备库在读取跨页的 WAL 记录时无限循环 (Kyotaro Horiguchi,Alexander Kukushkin) §
当记录的后续部分位于需要从不同 WAL 源读取的页面上时,会发生此问题。
修复在进程早期启动阶段 FATAL 错误被意外提升为 PANIC 的问题 (Noah Misch) §
这修复了一些可能导致 “PANIC: proc_exit() called in child process” 的罕见情况。
修复操作符族成员操作符或支持过程可能成为悬空引用的情况 (Tom Lane) § §
在某些情况下,数据类型可能被删除,但其 OID 的引用仍然保留在 pg_amop 或 pg_amproc 中。 虽然这不会导致直接问题,但尝试删除所属的操作符族时会失败, 且 pg_dump 在导出操作符族时会产生错误的输出。 此修复使得创建和修改操作符族/类时添加所需的依赖条目, 以便删除数据类型时也会删除任何依赖的操作符族元素。 但这对已存在的有漏洞的操作符族没有帮助,因此还为 DROP OPERATOR FAMILY 添加了一个临时措施, 以防止在删除具有悬空成员的族时失败。
修复逻辑解码输出中的多处内存泄漏 (Vignesh C,Masahiko Sawada,Boyu Yang) § § §
修复更新 application_name 或 cluster_name 设置时的小型内存泄漏 (Tofig Aliev) §
避免在测试 wal_skip_threshold 条件时的整数溢出 (Tom Lane) §
创建了非常大的关系的事务可能错误地决定通过将关系复制到 WAL 而不是 fsync 来确保持久性,从而违背了 wal_skip_threshold 的目的。(这仅在 wal_level 设置为 minimal 时才有意义,否则无论如何都需要 WAL 复制。)
修复缓存查找期间不安全的操作顺序(Noah Misch) §
唯一已知的后果是在 GRANT TABLESPACE 期间出现通常无害的 “you don't own a lock of type ExclusiveLock” 警告。
修复在较旧的 ARM 平台上使用 JIT 时可能出现的 “failed to resolve name” 失败 (Thomas Munro) §
这可能由于 gcc 和 clang 之间关于 -moutline-atomics 默认设置的不一致而发生。已知至少 Debian 和 Ubuntu 附带的 gcc 和 clang 编译器的目标是 armv8-a,但在默认使用 outline atomics 上存在差异。
修复 WITH RECURSIVE ... UNION 查询中的断言失败 (David Rowley) §
避免在规则反解析中,当集合操作叶子查询包含集合操作时的断言失败 (Man Zeng,Tom Lane) §
避免并行查询启动中的边界情况断言失败(Tom Lane) §
修复关闭时写出统计文件时的断言失败 (Michael Paquier) §
在 NULLIF() 中,避免将可读写的扩展对象指针传递给 数据类型的等值函数(Tom Lane) §
如果给定可读写指针,等值函数可能会修改或删除该对象, 而如果我们决定将其作为 NULLIF() 的结果返回,这将是有害的。 对于任何内置等值函数可能没有问题,但使用 PL/pgSQL 编写的函数可以很容易地演示此故障。
确保对 INSERT 中的默认空值应用表达式预处理 (Tom Lane) §
如果目标列是域类型,规划器必须插入一个强制转换到域的步骤而不仅仅是一个空常量, 而此表达式遗漏了一些必需的处理步骤。对于基于核心数据类型的域没有已知后果, 但理论上对于基于扩展类型的域可能会出现错误。
修复 PL/Python 中的内存泄漏(Mat Arye,Tom Lane) §
重复使用 PLyPlan.execute 或 plpy.cursor 会在调用 PL/Python 函数的持续时间内导致内存泄漏。
修复 PL/Tcl 以支持使用 Tcl 9 编译(Peter Eisentraut) §
在 ecpg 预处理器中,修复引用超出作用域变量的游标 可能被错误处理的问题(Tom Lane) §
在 ecpg 中,修复关于不支持使用 COPY ... FROM STDIN 的编译时警告 (Ryo Kanbayashi) §
此前,由于拼写错误,预期的警告未被发出。
修复 psql 以安全处理以 SJIS 编码的文件路径名 (Tom Lane) §
SJIS 中的某些双字节字符的第二个字节等于 ASCII 反斜杠(\)。 这些字符会被路径名规范化破坏,从而阻止访问名称中包含此类字符的文件。
修复在 pgbench 和 psql 中使用错误版本的 pqsignal() 的问题 (Fujii Masao,Tom Lane) §
此错误可能导致在 pgbench 中使用 -T 选项或在 psql 中使用 \watch 命令时出现异常行为,因为被中断的系统调用 未能按预期恢复。
修复 pgbench 中某些嵌套 \if 构造的错误执行(Michail Nikolaev) §
出现在 false(不被执行的)\if 分支内部的 \if 命令被错误地当作 \elif 处理。
在 pgbench 中,修复表初始化期间进度消息的显示错误 (Yushi Ogiwara,Tatsuo Ishii,Fujii Masao) § §
使 pg_controldata 对损坏的 pg_control 文件更加健壮 (Ilyasov Ian,Anton Voloshin) §
由于 pg_controldata 即使 CRC 检查失败也会尝试打印 pg_control 的内容,它必须注意不要对无效的字段值产生异常行为。 此补丁修复了由无效时间戳和看似为负数的 WAL 段大小触发的一些问题。
修复 pg_dump 在导出附加到作为扩展成员的表的 身份序列时可能崩溃的问题(Tom Lane) §
修复 pg_restore 处理 zstd 压缩数据时的内存泄漏 (Tom Lane) §
该泄漏是每次解压缩操作都会发生的,因此在包含许多表或大对象的导出中最为明显。
修复 pg_basebackup 以正确处理 Windows 上超过 2GB 的 pg_wal.tar 文件 (Davinder Singh,Thomas Munro) § §
在 contrib/earthdistance 的 SQL 语言函数声明中使用 SQL 标准函数体(Tom Lane,Ronan Dunklau) §
此变更允许在扩展创建期间解析其对 contrib/cube 的引用, 降低了基于搜索路径的失败和可能攻击的风险。
特别是,这恢复了它们在生成列等上下文中的可用性, PostgreSQL v17 出于安全原因限制了这些上下文中的搜索路径。 我们收到了由于此原因导致数据库无法升级到 v17 的报告。 此补丁包含在 v16 中以提供一个解决方案:事先将 earthdistance 扩展更新到此版本应该可以使升级成功。
更新用于确定访问 ARM CRC 指令所需编译器开关的配置探测 (Tom Lane) §
在基线 CPU 目标缺少 CRC 指令的 ARM 平台上,我们需要提供 -march 开关来说服编译器编译此类指令。 近期版本的 gcc 拒绝了我们之前尝试的值,导致静默回退到软件 CRC。
修复 meson 构建系统以支持 Windows 上的旧版 OpenSSL 库 (Darek Slusarczyk) §
增加了对旧版库名 ssleay32 和 libeay32 的支持。
在使用 meson 的 Windows 构建中,确保所有 libcommon 和 libpgport 函数都被导出(Vladlen Popolitov,Heikki Linnakangas) § §
这修复了扩展的 “unresolved external symbol” 构建错误。
修复 meson 配置过程以在 MSVC 下正确检测 OSSP 的 uuid.h 头文件(Andrew Dunstan) §
使用 meson 构建时,将 pgevent 安装到 pkglibdir 而不是 bindir (Peter Eisentraut) §
这与基于 make 的构建系统和旧的 MSVC 构建系统的行为一致。
使用 meson 构建时,将 sepgsql.sql 安装到 share/contrib/ 而不是 share/extension/ (Peter Eisentraut) §
这与基于 make 的构建系统的行为一致。
将时区数据文件更新为 tzdata 2025a 版本, 包含巴拉圭的夏令时法规变更以及菲律宾的历史修正 (Tom Lane) §