发布日期:. 2025-02-13
本次发布包含来自 15.10 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
增强 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) §
此疏忽可能允许进程尝试访问已被 vacuum 清除的数据。 一个已知后果是出现暂时性的 “could not access status of transaction” 错误。
修复可能导致新插入的系统目录条目未能被添加到系统目录缓存列表中的竞态条件 (Heikki Linnakangas) §
例如,这可能导致在现有会话中无法使用新创建的函数。
防止在系统目录与更新并发执行 vacuum 时可能发生的系统目录损坏 (Noah Misch) §
修复关系截断失败时的数据损坏 (Thomas Munro) § § §
执行关系截断所需的文件系统调用可能失败,导致磁盘上状态不一致 (例如,实际上恢复了已删除的数据)。我们无法真正防止这种情况, 但可以通过将此类失败变为 PANIC 来恢复一致性, 从而通过从 WAL 重放到截断尝试之前来恢复一致性。 这不是一个非常理想的行为,但此类失败足够罕见, 因此这似乎是一个可以接受的解决方案。
防止在关系截断期间启动检查点 (Robert Haas) §
这避免了一个竞态条件,即修改后的文件可能在完成检查点之前未被 fsync, 如果操作系统在此后不久崩溃,则存在数据损坏的风险。
使用 rename() 而非 link()/unlink() 来重命名文件 (Nathan Bossart) §
之前的代码旨在确保操作不会意外覆盖已有文件。但是失败可能会留下两个指向同一文件的链接, 使后续操作混乱并产生数据损坏的风险。在实践中,我们不会在目标文件名可能已存在的地方 使用此功能,因此放弃不覆盖保证以消除多链接风险似乎更好。
避免在 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) §
在 pg_hba_file_rules() 输出中包含 ldapscheme 选项 (Laurenz Albe) § §
当列的排序规则不一致时不要合并 UNION 操作 (Tom Lane) §
之前在决定是否可以安全地将 UNION 步骤合并为单个 N 路 UNION 操作时忽略了排序规则。 在引入非确定性排序规则之前,这可以说是有效的, 但现在不再如此,因为使用的排序规则可能影响唯一性的定义。
修复分区裁剪步骤中遗漏的表达式处理 (Tom Lane) §
此疏忽可能导致访问分区表的查询出现 “unrecognized node type” 错误,以及可能的其他问题。
允许 dshash 表增长超过 1GB (Matthias van de Meent) §
这避免了类似 “invalid DSA memory alloc request size” 的错误。例如,在处理数百万张表的事务中可能出现这种情况。
避免 bringetbitmap() 中可能的整数溢出 (James Hunter,Evgeniy Gorbanyov) §
由于结果仅用于统计目的,此错误的影响主要是外观上的。
防止流复制备库在读取跨页面的 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) § § §
避免在内存不足时由于缺少对 malloc() 失败返回的检查而导致的低概率崩溃 (Karina Litskevich) §
避免在测试 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 已知搭载了目标为 armv8-a 但在默认使用 outline atomics 方面存在差异的 gcc 和 clang 编译器。
修复非 PostgreSQL 来源的 Windows 连接点的处理 (Thomas Munro) § §
之前,如果数据目录的路径包含展开后不是“驱动器绝对路径”格式的连接点, 或其展开指向另一个连接点,initdb 将会失败。
修复 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_basebackup 以正确处理在 Windows 上 超过 2GB 的 pg_wal.tar 文件 (Davinder Singh,Thomas Munro) § §
更新确定访问 ARM CRC 指令所需编译器开关的配置探测 (Tom Lane) §
在基线 CPU 目标缺乏 CRC 指令的 ARM 平台上,我们需要提供 -march 开关来说服编译器编译此类指令。较新版本的 gcc 拒绝了我们尝试的值, 导致静默回退到软件 CRC。
在 configure 期间,如果检测到 C23 编译器, 尝试请求 C17 (Thomas Munro) §
v16 之前的 PostgreSQL 版本无法在 C23 规则下编译。 如果所选编译器默认为 C23 或更高版本,尝试添加 -std=gnu17 开关来更改。(如果这对你的编译器不起作用,请手动指定带有合适开关的 CFLAGS。)
将时区数据文件更新到 tzdata 版本 2025a,包含巴拉圭的夏令时法律变更以及菲律宾的历史修正 (Tom Lane) §