发布日期:. 2024-08-08
本次发布包含来自 15.7 的多项修复。 有关 15 主版本新特性的说明,请参见 Section E.18。
防止在 pg_dump 期间执行未经授权的代码 (Masahiko Sawada) §
能够创建和删除非临时对象的攻击者可以注入 SQL 代码, 该代码将由并发的 pg_dump 会话以运行 pg_dump 的角色权限(通常是超级用户)执行。 该攻击涉及将序列或类似对象替换为会执行恶意代码的视图或外部表。 为防止此问题,引入了新的服务器参数 restrict_nonsystem_relation_kind, 可以禁用非内置视图的展开以及对外部表的访问, 并让 pg_dump 在可用时设置该参数。 请注意,只有当 pg_dump 和它正在导出的服务器 都足够新以包含此修复时,才能防止该攻击。
PostgreSQL 项目感谢 Noah Misch 报告此问题。 (CVE-2024-7348)
防止 VACUUM 中的无限循环 (Melanie Plageman) §
在一个带有旧运行事务的已断开连接的备库重新连接到主库后, 主库上的 VACUUM 可能会在判断哪些元组可以移除时产生混乱, 从而导致无限循环。
修复将表作为分区附加后的失败问题,如果该表之前已有继承子表 (Álvaro Herrera) §
修复涉及不一致的基于索引的约束时的 ALTER TABLE DETACH PARTITION (Álvaro Herrera,Tender Wang) § §
当分区表有一个未关联约束的索引,但某个分区有一个等效的且关联了约束的索引时, 分离该分区会产生错误行为,导致原分区的约束具有不正确的 coninhcount 值。 这会在后续对该约束的任何操作中引起问题。
修复 ALTER TABLE DETACH PARTITION CONCURRENTLY 期间的分区裁剪设置 (Álvaro Herrera) § §
执行器假设在对分区表的查询规划和执行之间不会有分区被分离。 自从引入 DETACH PARTITION 的 CONCURRENTLY 选项后, 这一假设不再成立,使得在使用该选项时查询执行可能会暂时失败。
在最后一个子分区被删除后,正确地将分区表的 pg_class.reltuples 字段更新为零(Noah Misch) §
对这样的分区表执行第一次 ANALYZE 时必须同时更新 relhassubclass, 而这导致 reltuples 的更新丢失。
SQL CALL 语句未能为此类参数解析正确的数据类型, 导致诸如 “cannot display a value of type anyelement” 之类的错误, 甚至直接崩溃。(但 PL/pgSQL 中的 CALL 可以正常工作。)
修复从 CALL 语句参数列表中调用的稳定函数的行为 (Tom Lane) §
如果 CALL 处于原子上下文中 (例如存在外部事务块),此类函数会被传入错误的快照, 导致它们看到自外部事务开始以来已修改的行的过时值。
检测 money 计算中的整数溢出 (Joseph Koshakow) §
money 类型的所有算术函数之前都不检查溢出, 因此在溢出的情况下会静默地给出错误的结果。
修复 round(numeric) 和 trunc(numeric) 中对精度参数的过度限制 (Dean Rasheed) §
这些函数将其精度参数限制在 +/-2000 以内,但存在需要更大值的有效用例; 在此类情况下函数返回了不正确的结果。改为将其限制在 numeric 类型实际允许的范围内。
修复 pg_size_pretty() 应用于最小可能的 bigint 值时的结果(Joseph Koshakow) §
防止 pg_sequence_last_value() 在备库上的非日志序列 以及其他会话的临时序列上失败(Nathan Bossart) §
在这些情况下使其返回 NULL 而不是抛出错误。
修复 websearch_to_tsquery() 中对被忽略的操作符的解析 (Tom Lane) §
根据手册,websearch_to_tsquery() 的输入中的标点符号 除了连字符和引号的特殊情况外都会被忽略。但是,紧接在 or 之前出现的括号和其他一些字符可能导致 or 被当作数据词处理,而不是按预期作为 OR 操作符处理。
检测在计算新数组维度时的另一个整数溢出情况 (Joseph Koshakow) §
拒绝将数组维度 [-2147483648:2147483647] 应用于空数组。 这与 CVE-2023-5869 密切相关,但看起来是无害的,因为数组最终仍然为空。
检测目录缓存条目在解压其字段时变得过时的另一种情况 (Noah Misch) §
在展开目录元组的行外字段时发生的原地更新可能会被遗漏, 导致目录缓存条目缺少原地更改但不被认为是过时的。 这仅在 pg_database 目录中可能发生, 因此影响范围较窄,但可能会导致异常行为。
正确检查 INSERT ... DEFAULT 所针对的视图列的可更新性 (Tom Lane) §
如果这样的列是不可更新的,应当给出一个报告该情况的错误。 但该检查被遗漏了,之后的代码会报告一个无用的错误,例如 “attribute number N not found in view targetlist”。
避免对不正确的递归查询报告无用的内部错误 (Tom Lane) §
重新排列错误检查的顺序,以便当 WITH RECURSIVE 查询 在 UNION 的第二个分支中没有自引用,但在 ORDER BY 等其他位置有自引用时,能够抛出一个准确的错误。
在 ALTER TABLE SET LOGGED|UNLOGGED 期间锁定所拥有的序列(Noah Misch) §
这些命令会随表一起更改其所拥有序列的持久性, 但它们在执行此操作时未能获取序列上的锁。 这可能导致丢失并发 nextval() 调用的结果。
如果已排队的 AFTER 触发器不再存在,不要抛出错误 (Tom Lane) §
事务有可能执行一个操作将延迟的 AFTER 触发器排入队列等待稍后执行, 然后在触发器执行之前将其删除。以前这会导致诸如 “could not find trigger NNNN” 之类的奇怪错误。 如果触发器在应该被执行时已不再存在,更好的做法是静默地不执行任何操作。
修复当表被删除时未能移除 pg_init_privs 中 列级权限条目的问题(Tom Lane) §
如果扩展在它创建的表上授予了一些列级权限,在扩展被删除后, 相关的目录条目会被遗留。这在表的 OID 被另一个关系重用之前是无害的, 届时可能会干扰 pg_dump 对该关系的导出内容。
修复当所需索引包含表达式或谓词时 ON CONFLICT 的仲裁索引选择(Tom Lane) §
如果使用 ON CONFLICT 的查询通过可更新视图访问目标表, 即使存在匹配的索引,也可能会失败并报告 “there is no unique or exclusion constraint matching the ON CONFLICT specification”。
拒绝使用 ALTER TABLE 修改另一个会话的临时表 (Tom Lane) §
权限检查通常会阻止这种情况的发生,但可以通过修改一个父表来达到这一点, 而该父表的子表是另一个会话的临时表。如果发现这样的子表属于另一个会话, 则抛出错误。
修复 CREATE TABLE LIKE STATISTICS 中 对表达式上扩展统计信息的处理(Tom Lane) §
CREATE 命令未能将统计信息表达式中的列引用 调整为新表中可能不同的列编号。这会导致无效的统计信息对象, 并在后续引发问题。需要重新编号列的典型场景是源表包含一些已删除的列。
修复从 MIN() 或 MAX() 聚合生成的子查询未能重新计算的问题(Tom Lane) §
在某些情况下,在外部查询的某一行计算出的聚合结果可能会被后续行错误地重用。 这仅在外部查询使用通过哈希聚合实现的 DISTINCT 时 被观察到,但可能还存在其他情况。
避免当 JIT 内联的后端函数抛出错误时崩溃 (Tom Lane) §
错误状态可能包含指向持有 JIT 编译代码的动态加载模块的指针(用于错误位置字符串)。 在某些代码路径中,该模块可能在错误报告被处理之前就被卸载, 导致在访问位置字符串时出现 SIGSEGV。
处理 libxml2 版本 2.13.x 中的行为变更(Erik Wienhold,Tom Lane) §
值得注意的是,我们现在会抑制 libxml2 的 “chunk is not well balanced” 错误, 除非这是唯一报告的错误。这是为了使错误报告在 2.13.x 和更早的 libxml2 版本之间保持一致。 在早期版本中,该消息几乎总是冗余的或完全不正确的, 因此 2.13.x 大幅减少了报告该消息的情况。
修复启动热备服务器时对已准备事务的子事务的处理 (Heikki Linnakangas) §
当备库的重放从关闭检查点 WAL 记录开始时,在主库上已准备但尚未提交的事务 会被正确理解为仍在进行中。但已准备事务的子事务(由保存点或 PL/pgSQL 异常块创建)没有被考虑在内, 会被视为已中止。如果该已准备事务随后被提交,就会导致不一致。
防止逻辑复制槽的错误初始化 (Masahiko Sawada) §
在某些情况下,复制槽在 WAL 流中的起始点可能被设置在事务内部的某个位置, 导致断言失败或不正确的解码结果。
避免在复制槽创建和删除期间出现 “can only drop stats once” 错误 (Floris Van Nee) §
修复逻辑复制 WAL 发送者中的资源泄漏(Hou Zhijie) §
当发布对分区表的更改时,如果分区的行类型与分区表的行类型在物理上不同, walsender 进程会泄漏内存。
避免在处理通知或共享失效中断后的内存泄漏 (Tom Lane) §
这些事件的处理函数可能会将当前内存上下文切换到 TopMemoryContext, 导致在错误设置被替换之前分配的所有数据产生会话级别的泄漏。 至少存在与传入查询的编码转换以及附加到 Bind 消息的参数相关的可观察泄漏。
防止统计信息共享内存块的引用计数泄漏 (Anthonin Bonnefoy) §
新的后端进程附加到统计信息共享内存时会递增其引用计数, 但在退出时未能递减该计数。在创建了 232 个会话后,引用计数将溢出为零, 导致所有后续后端进程启动失败。
防止在截断多事务 SLRU 日志期间出现死锁和断言失败 (Heikki Linnakangas) §
尝试删除 SLRU 段的进程可能会与检查点进程产生死锁。
避免在 Windows 套接字上可能遗漏输入结束事件 (Thomas Munro) §
Windows 在远端断开连接后只报告一次 FD_CLOSE 事件。 如果时机不巧,我们可能会错过该报告并无限期等待, 或至少等到超时到期,以期获得更多输入。
修复 JSON 解析错误报告中针对不完整字节序列的缓冲区越界读取 (Jacob Champion) §
当最后的字节构成一个不完整的多字节字符时,可能会超出输入缓冲区末尾几个字节。 虽然通常是无害的,但原则上这可能导致崩溃。
禁止 OpenSSL 创建有状态 TLS 会话票据 (Daniel Gustafsson) § § §
这避免了客户端在收到会话票据后认为支持 TLS 会话恢复而可能导致的失败。
在重新规划 PL/pgSQL 的“简单表达式”时, 检查它是否仍然是简单的(Tom Lane) §
某些较为人为的情况,例如删除一个被引用的函数并将其重新创建为聚合, 可能导致诸如 “unexpected plan node type” 之类的意外失败。
修复 PL/Perl 与 Perl 5.40 之间的不兼容问题(Andrew Dunstan) §
修复递归的返回 RECORD 类型的 PL/Python 函数(Tom Lane) §
如果递归到同一个函数的新调用并传递了不同的列定义列表(AS 子句), 会因为内部调用覆盖了外部调用关于返回行类型的信息而失败。
不要在递归触发器调用期间损坏 PL/Python 的 TD 字典 (Tom Lane) §
如果一个 PL/Python 语言的触发器导致另一个触发器被调用, 为内部触发器创建的 TD 字典会覆盖外部触发器的 TD 字典。
修复 PL/Tcl 对返回元组的函数结果中 无效列表语法的报告(Erik Wienhold,Tom Lane) §
这种情况可能导致崩溃,或者发出实际上指向先前 Tcl 错误的误导性上下文信息。
避免在 libpq 中非线程安全地使用 strerror()(Peter Eisentraut) §
在多线程应用程序中,OpenSSL 返回的某些错误消息可能会变得混乱。
避免在二进制升级期间 pg_dump 中的内存泄漏 (Daniel Gustafsson) §
确保 pg_restore -l 正确报告依赖的 TOC 条目(Tom Lane) §
如果 -l 与选择性恢复选项(如 -n 或 -N)一起指定, 依赖的 TOC 条目(如注释)会从列表中被遗漏, 即使实际恢复时会选择它们。
避免在 contrib/postgres_fdw 中出现 “cursor can only scan forward” 错误 (Etsuro Fujita) §
当远程服务器为 v15 或更高版本且外部表映射到非平凡的远程视图时, 可能会出现此错误。
在 contrib/postgres_fdw 中,不要将 FETCH FIRST WITH TIES 子句发送到远程服务器 (Japin Li) §
远程服务器可能不支持此子句,或者可能与本地的解释不同, 因此不要冒险尝试远程执行。
避免与系统提供的 <regex.h> 头文件冲突 (Thomas Munro) §
这修复了在 macOS 版本 15 及更高版本上的编译失败。
修复 Memoize 代价估算中无害的断言失败 (David Rowley) §
修复对 SP-GiST 索引执行 REINDEX CONCURRENTLY 时无害的断言失败(Tom Lane) §
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。