发布日期:. 2025-02-13
此版本包含来自16.6的各种修复。 有关16的主要版本中新功能的信息,请参阅 第 E.9 节。
加强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)
§
这一疏忽可能会允许一个进程尝试访问已经被清理掉的数据。已知的一个后果是 短暂的“无法访问事务状态”错误。
修复可能导致无法将新插入的目录条目添加到目录缓存列表的竞争条件 (Heikki Linnakangas) §
例如,这可能导致在现有会话中无法使用新创建的函数。
防止在系统目录与更新同时进行清理时可能发生的目录损坏 (Noah Misch) §
修复关系截断失败时的数据损坏问题 (Thomas Munro) § § §
执行关系截断所需的文件系统调用可能会失败,从而在磁盘上留下不一致的 状态(例如,实际上恢复已删除的数据)。我们无法真正防止这种情况,但 我们可以通过将此类失败转化为PANIC来恢复,从而通过从WAL重放到截断尝 试之前的状态来恢复一致性。这并不是一种非常理想的行为,但此类失败足 够罕见,因此似乎是一个可以接受的解决方案。
防止在关系截断期间启动检查点 (Robert Haas) §
这避免了一个竞争条件,其中修改后的文件可能在完成检查点之前 没有被fsync,从而在操作系统很快崩溃的情况下产生数据损坏的风险。
避免在VACUUM
与REASSIGN OWNED
同时运行时,
可能丢失pg_database
.datfrozenxid
的更新,这会更改该数据库的所有者(Kirill Reshke)
§
修复传递给tg_updatedcols
的错误值,
这些值被传递到AFTER UPDATE
触发器 (Tom Lane)
§
在某些情况下,tg_updatedcols
位图可能描述了同一事务中
先前命令更新的列集,从而误导触发器执行错误的操作。
同时,防止由于创建过多
tg_updatedcols
位图的副本而导致的内存膨胀。
修复分区的分离问题,该分区具有自己的外键约束,引用了一个分区表 (Amul Sul) §
在常见情况下,外键通常定义在分区表的顶层;但如果外键定义在一个分区上并
引用一个分区表,而引用的分区被分离,则相关的
pg_constraint
条目会被错误地更新。这会导致类似
“无法找到外键约束的 ON INSERT 检查触发器”的错误。
修复to_timestamp
的FF
格式代码的错误处理(Tom Lane)
§
n
一个整数格式代码紧接在FF
之前会消耗所有可用的数字,导致n
FF
没有剩余的数字。
n
在反解析XMLTABLE()
表达式时,确保在必要时对XML命名空间名
称加上双引号(Dean Rasheed)
§
不要合并UNION
操作,如果它们的列排序规则不一致
(Tom Lane)
§
之前在决定是否可以安全地将UNION
步骤合并为单个
N路UNION
操作时,我们忽略了排序规则。在引入非确定性
排序规则之前,这可能是合理的,但现在不再如此,因为使用的排序规则
会影响唯一性的定义。
查找统计信息时忽略空关系标记位 (Richard Guo) §
这种疏忽可能会导致未能使用与表达式相关的统计数据,或者出现 “损坏的MVNDistinct条目”错误。
修复分区修剪步骤中遗漏的表达式处理 (Tom Lane) §
此疏忽可能会导致“未识别的节点类型”错误,以及在访问分区表的查询中 出现其他问题。
允许dshash表增长超过1GB(Matthias van de Meent) §
这可以避免类似“无效的DSA内存分配请求大小”的错误。此情况可能 发生在处理数百万张表的事务中。
避免在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”。
修复了操作符家族成员操作符或支持过程可能变成悬空引用的情况 § §
在某些情况下,数据类型可能会被删除,而对其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) §
唯一已知的后果是一个通常无害的“你没有拥有类型为
ExclusiveLock 的锁”警告,发生在GRANT TABLESPACE
期间。
修复在旧的ARM平台上使用JIT时可能出现的 “无法解析名称失败”问题 (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)
§
此错误可能会导致在使用-T
选项时
的pgbench或\watch
命令中的psql出现异常行为,
因为中断的系统调用未按预期恢复。
修复在pgbench中某些嵌套
\if
结构的错误执行 (Michail Nikolaev)
§
一个\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) §
在ARM平台上,如果基线CPU目标缺少CRC指令,我们需要提供一个-march
开关来让编译器编译这些指令。最近版本的gcc拒绝了我们尝试的值,导致静默地回退到
软件CRC。
修复meson构建系统以支持Windows上的旧版OpenSSL库 (Darek Slusarczyk) §
添加对旧版库名称ssleay32
和libeay32
的支持。
在使用meson的Windows构建中,确保所有libcommon和libpgport函数都被导出 (Vladlen Popolitov, Heikki Linnakangas) § §
这修复了“未解析的外部符号”构建错误, 适用于扩展。
修复meson配置过程,以正确检测OSSP的uuid.h
头文件
在MSVC下的使用(Andrew Dunstan)
§
使用meson构建时,将pgevent
安装到
pkglibdir
而不是
bindir
(Peter Eisentraut)
§
这与基于make的构建系统和旧的MSVC构建系统的行为相匹配。
使用meson构建时,将sepgsql.sql
安装到
share/contrib/
目录下,而不是
share/extension/
(Peter Eisentraut)
§
这与基于make的构建系统的行为相匹配。
更新时区数据文件到tzdata版本2025a,以适应巴拉圭 的夏令时法律变更,以及对菲律宾的历史修正(Tom Lane) §