发布日期:. 2025-02-13
本次发布包含自 17.2 以来的多项修复。 有关 17 主版本中新特性的更多信息,请参见 Section E.10。
加强 PQescapeString 及相关函数对无效编码输入字符串的防护(Andres Freund、Noah Misch) § § § § § §
由 libpq 提供的数据加引号函数现在会完整检查其输入的编码有效性。若检测到无效字符,它们会在可能时报告错误。对于那些没有错误返回约定的函数,会调整输出字符串,以确保服务器会报告编码无效,并且任何中间处理都不会被恰好匹配单引号、反斜杠等的字节所欺骗。
此次变更的目的是防范 SQL 注入攻击,这类攻击在使用这些函数之一为精心构造的输入加引号时可能发生。如果结果字符串被直接发送给 PostgreSQL 服务器,则不存在风险,因为服务器无论如何都会检查其编码;但如果它经过 psql 或其他客户端代码,则存在风险。历史上,这类代码并未认真校验编码,而且在很多情况下,即使检测到这类问题,也不清楚应当如何处理。
只有当数据加引号函数、服务器以及任何中间处理所使用的字符编码彼此一致时,此修复才会生效。把不可信输入插入 SQL 命令的应用应特别注意确保这一点。
在不使用这些 libpq 函数的情况下为不可信输入加引号的应用和驱动,也可能面临类似风险。它们应先确认数据在服务器预期编码下是有效的。
PostgreSQL 项目感谢 Stephen Fewer 报告此问题。 (CVE-2025-1094)
恢复对连接请求中出现的数据库名和用户名的自动截断(Nathan Bossart) §
这撤销了 v17 中一项后来证明给部分用户带来麻烦的变更。过长名称本应以感知编码的方式截断,但目前先恢复为此前在 NAMEDATALEN-1 字节处盲目截断的行为。
将并行工作进程排除在连接权限检查和连接限制之外(Tom Lane) §
在启动并行工作进程时,不检查 datallowconn、rolcanlogin 和 ACL_CONNECT 权限,而是假定 leader 进程先前通过了类似检查就已足够。这样例如可以避免当 leader 以不具备登录权限的角色运行时,并行化查询意外失败。同样地,仅对常规后端实施 ReservedConnections、datconnlimit 和 rolconnlimit 限制,并且在检查这些限制是否已达到时也只统计常规后端。这些限制旨在防止常规后端过度消耗进程槽位,而并行工作进程及其他特殊进程拥有各自的进程槽池及其自身的限制检查。
从 LWLock 等待事件名称中移除 “Lock” 后缀(Bertrand Drouvot) §
重构意外导致 pg_stat_activity 视图显示的锁相关等待事件名称带上了 “Lock” 后缀,这除其他影响外,还破坏了它与 pg_wait_events 的连接。
修复带有 ScalarArrayOp(= ANY)条件的 btree 索引扫描可能无法返回所有匹配元组的问题(Peter Geoghegan) §
修复窗口聚合中可能重复使用陈旧结果的问题(David Rowley) §
带有 “run condition” 优化且结果类型按引用传递的窗口聚合,可能会错误返回上一个分区的结果,而不是重新计算。
保持 TransactionXmin 与 MyProc->xmin 同步(Heikki Linnakangas) §
这一疏漏可能允许某个进程尝试访问已经被 vacuum 清除的数据。一个已知后果是会短暂出现 “could not access status of transaction” 错误。
修复可能导致新插入的系统目录条目无法加入系统目录缓存列表的竞争条件(Heikki Linnakangas) §
例如,这可能导致在已有会话中无法使用新创建的函数。
修复关系截断失败时的数据损坏问题(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” 之类的错误。
修复 pg_get_constraintdef 对域上的 NOT NULL 约束的支持(Álvaro Herrera) §
修复 to_timestamp 对 FF 格式码的错误处理(Tom Lane) §n
如果某个整数字格式码紧挨在 FF 前面,它就会消耗掉所有可用数字,从而不给 nFF 留下任何数字。n
在反解析 SQL/JSON 查询函数中的 PASSING 子句时,确保在必要时对变量名加双引号(Dean Rasheed) §
在反解析 XMLTABLE() 表达式时,确保在必要时对 XML 命名空间名称加双引号(Dean Rasheed) §
修复在输入列数据类型并不完全匹配时,对预排序 UNION 操作的规划(David Rowley) §
这个错误可能导致使用错误的排序操作符对数据排序,后果从没有明显问题到 core dump 都有可能。
如果 UNION 操作的列排序规则不一致,则不要将其合并(Tom Lane) §
以前,我们在判断是否可以把多个 UNION 步骤安全合并为一个 N 路 UNION 操作时,会忽略排序规则。在引入 nondeterministic collation 之前,这或许还说得过去;但现在已不再成立,因为所使用的排序规则会影响唯一性的定义。
防止在上拉位于外连接之下的子查询后出现 “wrong varnullingrels” 规划器错误(Tom Lane) § §
查找统计信息时忽略 nulling-relation 标记位(Richard Guo) §
这一疏漏可能导致无法使用与表达式相关的统计信息,或触发 “corrupt MVNDistinct entry” 错误。
修复分区裁剪步骤遗漏表达式处理的问题(Tom Lane) §
这一疏漏可能导致访问分区表的查询出现 “unrecognized node type” 错误,也可能引发其他问题。
为 slotsync 工作进程提供独立的进程槽位(Tom Lane、Hou Zhijie) §
在加入 slotsync 工作进程时忽略了这一点,结果它的进程槽位实际上是从供常规后端进程使用的池中占用的。如果常规后端进程数量逼近 max_connections,这可能导致该工作进程无法启动,或使后续本应按配置成功的连接请求失败。
允许 dshash 表增长到超过 1GB(Matthias van de Meent) §
这可以避免诸如 “invalid DSA memory alloc request size” 的错误。例如,在处理数百万张表的事务中就可能出现这种情况。
避免 bringetbitmap() 中可能发生的整数溢出(James Hunter、Evgeniy Gorbanyov) §
由于该结果仅用于统计目的,因此这个错误的影响大多只是表面上的。
纠正 SLRU bank 编号的错误计算(Yura Sokolov) §
这个错误导致实际使用的 bank 数量少于预期,从而增加了争用,但没有造成功能性错误。
确保已设置的进程 latch 不会妨碍 postmaster 注意到 socket 事件(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 增加了一个补丁式修复,以防删除含有悬空成员的操作符族时失败。
修复更新 application_name 或 cluster_name 设置时的轻微内存泄漏(Tofig Aliev) §
避免后台进程尝试检查 synchronized_standby_slots 的新值时崩溃(Álvaro Herrera) §
避免测试 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” 警告。
避免并行 vacuum 中潜在的 use-after-free(Vallimaharajan G、John Naylor) §
这个 bug 在标准构建中似乎不会造成后果,但理论上仍然存在风险。
修复在较旧 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) §
避免 valgrind 对字符串哈希代码发出告警(John Naylor) §
在 NULLIF() 中,避免将可读写的 expanded object 指针传给数据类型的相等比较函数(Tom Lane) §
如果传入的是可读写指针,相等比较函数就可能修改或删除该对象;而当我们决定把它作为 NULLIF() 的结果返回时,这显然是不合适的。对于任何内置相等比较函数,大概都不会有问题,但用 PL/pgSQL 编写的函数很容易演示出这种失败。
确保在 INSERT 中,表达式预处理也会应用到默认的 null 值(Tom Lane) §
如果目标列属于域类型,规划器就必须插入一个 coerce-to-domain 步骤,而不仅仅是一个 null 常量;但此前该表达式遗漏了一些必需的处理步骤。对于基于核心数据类型的域,目前尚无已知后果,但理论上在基于扩展类型的域上可能出现错误。
避免在已含有数据的关系 fork 上启动批量写入时发生数据丢失(Matthias van de Meent) §
任何已有数据都会被零值覆盖。核心 PostgreSQL 本身从不会这么做,因此不受影响;不过某些扩展可能希望这样做。
避免服务器进程试图遍历一个并非由自己创建的共享 radix tree 时崩溃(Masahiko Sawada) §
核心 PostgreSQL 中没有任何代码会这样做,但扩展可能会有这种需求。
修复 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 反斜杠(\)。这些字符会在路径名规范化时被破坏,从而导致无法访问文件名中包含这类字符的文件。
为 psql 增加 COPY (MERGE INTO) 的 Tab 补全(Jian He) §
修复 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 在处理附着于扩展成员表的 identity sequence 时可能崩溃的问题(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 的引用能够在扩展创建期间被解析,从而降低基于 search_path 的失败和潜在攻击风险。
特别是,这恢复了它们在生成列等场景中的可用性,而 PostgreSQL v17 出于安全原因对这类场景限制了 search_path。我们已经收到数据库因此无法升级到 v17 的报告。此补丁也已纳入 v16,作为一种变通方案:事先将 earthdistance 扩展更新到这个版本,应可使升级成功。
检测 contrib/pageinspect 的 SQL 声明与底层共享库之间的版本不匹配(Tomas Vondra) §
此前,这种不匹配在调用 brin_page_items() 时可能导致崩溃。现在则会抛出一条建议更新扩展的错误消息。
在尝试取消 contrib/postgres_fdw 中的远程查询时,如果取消请求看起来没有生效,则会重发数次(Tom Lane) §
这修复了一种竞争条件:我们可能在远程服务器尚未开始处理刚发出的查询前就尝试取消它,从而导致首次取消请求被忽略。
更新配置探测逻辑,以确定访问 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) §