发布日期:. 2025-02-13
本版本包含了来自17.2的各种修复。 有关17主版本中新功能的信息,请参见 Section E.6.
加强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
权限来启动并行工作者,而是假设领导进程
最初已经通过了类似的检查。这可以避免,例如,当领导进程以缺乏登录权限
的角色运行时,并行化查询意外失败。同样,仅对常规后端强制执行
ReservedConnections
、datconnlimit
和
rolconnlimit
限制,并且在检查是否已达到限制时,仅计
算常规后端。这些限制旨在防止常规后端过度消耗进程槽位——但并行工作者
和其他特殊进程有它们自己的进程槽位池,并有自己的限制检查。
从 LWLock 等待事件名称中去掉 “Lock” 后缀 (Bertrand Drouvot) §
重构无意中导致
pg_stat_activity
视图显示带有 “Lock” 后缀的锁相关等待事件名称,
这在某些方面破坏了将其与
pg_wait_events
连接的功能。
修复可能导致无法返回所有匹配元组的问题,针对带有 ScalarArrayOp
(= ANY
) 条件的 btree 索引扫描
(Peter Geoghegan)
§
修复窗口聚合中可能重复使用过时结果的问题(David Rowley) §
一个带有“运行条件”优化和按引用传递结果类型的窗口聚合可能会错误地返回 上一个分区的结果,而不是执行新的计算。
保持 TransactionXmin
与 MyProc->xmin
同步
(Heikki Linnakangas)
§
这一疏忽可能会允许一个进程尝试访问已经被清理掉的数据。已知的一个后果是 短暂的“无法访问事务状态”错误。
修复了可能导致无法将新插入的目录条目添加到目录缓存列表中的竞争条件(Heikki Linnakangas) §
例如,这可能导致在现有会话中无法使用新创建的函数。
修复关系截断失败时的数据损坏问题(Thomas Munro) § § §
执行关系截断所需的文件系统调用可能会失败,从而在磁盘上留下不一致的 状态(例如,实际上恢复已删除的数据)。我们无法真正防止这种情况,但 我们可以通过将此类失败转化为PANIC来恢复,从而通过从WAL重放到截断尝 试之前的状态来恢复一致性。这并不是一种非常理想的行为,但此类失败足 够罕见,因此似乎是一个可以接受的解决方案。
防止在关系截断期间启动检查点 (Robert Haas) §
这避免了一个竞争条件,其中修改后的文件可能在完成检查点之前 没有被fsync,从而在操作系统很快崩溃的情况下产生数据损坏的风险。
避免在pg_database
.datfrozenxid
字段更新时丢失数据,
当VACUUM
与更改该数据库所有者的REASSIGN OWNED
命令并发执行时
(Kirill Reshke)
§
修正传递给tg_updatedcols
的错误值,
这些值用于AFTER UPDATE
触发器(Tom Lane)
§
在某些情况下,tg_updatedcols
位图可能描述了同一事务中
先前命令更新的列集,从而误导触发器执行错误的操作。
同时,防止由于创建过多
tg_updatedcols
位图的副本而导致的内存膨胀。
修复了分区分离的问题,该分区具有自己的外键约束,引用了一个分区表(Amul Sul) §
在常见情况下,外键通常定义在分区表的顶层;但如果外键定义在一个分区上并
引用一个分区表,而引用的分区被分离,则相关的
pg_constraint
条目会被错误地更新。这会导致类似
“无法找到外键约束的 ON INSERT 检查触发器”的错误。
修复pg_get_constraintdef
对域上
NOT NULL
约束的支持
(Álvaro Herrera)
§
修复了对to_timestamp
的
FF
格式代码的错误处理
(Tom Lane)
§
n
一个整数格式代码紧接在FF
之前会消耗所有可用的数字,导致n
FF
没有剩余的数字。
n
在反解析 SQL/JSON 查询函数中的 PASSING
子句时,确保在必要时对变量名加双引号
(Dean Rasheed)
§
反解析XMLTABLE()
表达式时,确保在必要时对XML命名空间名称加双引号(Dean
Rasheed)
§
包含 ldapscheme
选项
在 pg_hba_file_rules()
输出中(Laurenz Albe)
§
§
修正了预排序UNION
操作的计划,针对输入列数据类型不完全匹配的情况(David
Rowley)
§
该错误可能导致使用错误的排序操作符对数据进行排序, 其后果从无明显问题到核心转储不等。
如果它们的列排序规则不一致,则不要合并UNION
操作(Tom Lane)
§
之前在决定是否可以安全地将UNION
步骤合并为单个
N路UNION
操作时,我们忽略了排序规则。在引入非确定性
排序规则之前,这可能是合理的,但现在不再如此,因为使用的排序规则
会影响唯一性的定义。
防止在提升位于外连接下方的子查询后出现 “错误的 varnullingrels” 规划器错误(Tom Lane) § §
查找统计信息时忽略空关系标记位(Richard Guo) §
这种疏忽可能会导致未能使用与表达式相关的统计数据,或者出现 “损坏的MVNDistinct条目”错误。
修复分区裁剪步骤中遗漏的表达式处理 (Tom Lane) §
此疏忽可能会导致“未识别的节点类型”错误,以及在访问分区表的查询中 出现其他问题。
给slotsync工作进程分配它自己的进程槽(Tom Lane,侯志杰) §
这一点在添加slotsync工作进程时被忽视,导致其进程槽实际上来自
用于常规后端进程的池。这可能导致工作进程启动失败,或者随后
按配置设置本应成功的连接请求失败,如果常规后端进程的数量接近
max_connections
。
允许 dshash 表增长超过 1GB(Matthias van de Meent) §
这可以避免类似“无效的DSA内存分配请求大小”的错误。此情况可能 发生在处理数百万张表的事务中。
避免可能的整数溢出
在 bringetbitmap()
中(James Hunter,Evgeniy
Gorbanyov)
§
由于结果仅用于统计目的,此错误的影响主要是表面上的。
纠正SLRU缓存区编号的错误计算(Yura Sokolov) §
该错误导致使用的银行数量少于预期,造成更多的争用,但没有功能性错误。
确保已设置的进程锁不会阻止postmaster注意到套接字事件(Thomas Munro) §
后端启动工作进程和工作进程退出的极高工作负载可能会阻止 postmaster及时响应传入的客户端连接。
防止流复制备用服务器在读取跨页的WAL记录时无限循环(堀口京太郎, 亚历山大·库库什金) §
当记录的续篇位于需要从不同的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)
§
避免后台进程尝试检查synchronized_standby_slots
的新值时崩溃
(Álvaro Herrera)§
避免在测试wal_skip_threshold
条件时发生整数溢出(Tom Lane)
§
创建一个非常大的关系的事务可能会错误地决定通过将关系复制到
WAL中来确保持久性,而不是执行fsync操作,从而使
wal_skip_threshold
的意义失效。
(这仅在wal_level
设置为
minimal
时才重要,否则无论如何都需要WAL副本。)
修复缓存查找过程中不安全的操作顺序(Noah Misch) §
唯一已知的后果是一个通常无害的“你没有拥有类型为
ExclusiveLock 的锁”警告,发生在GRANT TABLESPACE
期间。
避免在并行清理过程中可能出现的使用后释放问题(Vallimaharajan G, John Naylor) §
这个漏洞在标准构建中似乎没有后果,但理论上它是一个隐患。
修复在较旧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) §
避免 valgrind 对字符串哈希代码的警告(John Naylor) §
在NULLIF()
中,避免将可读写的扩展对象指针传递给数据类型的等值函数
(Tom Lane)
§
如果提供了一个读写指针,平等函数可能会修改或删除对象,这在我们决定将其
作为NULLIF()
结果返回时会很糟糕。对于任何内置的平等
函数可能没有问题,但用PL/pgSQL编写的一个函数很容易演示失败。
确保表达式预处理应用于INSERT
中的默认空值(Tom Lane)
§
如果目标列是一个域类型,计划器必须插入一个强制转换到域的步骤, 而不仅仅是一个空常量,并且这个表达式错过了一些必要的处理步骤。 对于基于核心数据类型的域,目前没有已知的后果,但理论上,对于基于 扩展类型的域,可能会发生错误。
避免在对已包含数据的关系分支启动批量写入时发生数据丢失(Matthias van de Meent) §
任何预先存在的数据都被用零覆盖。这对核心PostgreSQL来说不是问题, 因为它从不这样做。然而,一些扩展希望这样做。
如果服务器进程尝试遍历它未创建的共享基数树,则避免崩溃(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)
的制表符补全(贾恩·何)
§
修正了在pqsignal()
中使用错误版本的问题,
该问题出现在pgbench和psql中(藤井正雄,汤姆·莱恩)
§
此错误可能会导致在使用-T
选项时
的pgbench或\watch
命令中的psql出现异常行为,
因为中断的系统调用未按预期恢复。
修复了在\if
嵌套结构中某些错误执行的问题,
该问题出现在pgbench中(Michail Nikolaev)
§
一个\if
命令出现在一个假(未被执行的)
\if
分支中时,被错误地与\elif
视为相同。
使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
扩展更新到此版本,
应该可以使升级成功。
检测版本不匹配
在contrib/pageinspect
的SQL声明
与底层共享库之间(Tomas Vondra)
§
之前,这种不匹配可能会导致调用brin_page_items()
时崩溃。
现在改为抛出错误,建议更新该扩展。
当尝试取消 contrib/postgres_fdw
中的远程查询时,
如果取消请求似乎没有任何反应,请重新发送取消请求几次(Tom Lane)
§
这修复了一个竞态条件,在该条件下我们可能会尝试取消刚发送的查询, 而远程服务器尚未开始处理它,因此最初的取消请求被忽略。
更新配置探针以确定访问 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 配置过程以正确检测 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) §