发布日期:. 2020-11-12
本次发布包含来自 13.0 的多项修复。 有关 13 主版本新特性的说明,请参见 Section E.24.
对于运行 13.X 的用户,不需要执行导出/恢复。
禁止在索引表达式和物化视图查询中执行 DECLARE CURSOR ... WITH HOLD 以及触发延迟触发器(Noah Misch) §
这实际上是“安全受限操作”沙箱机制中的一个漏洞。有权创建非临时 SQL 对象的攻击者可以利用此漏洞,以超级用户身份执行任意 SQL 代码。
PostgreSQL 项目感谢 Etienne Stalmans 报告此问题。(CVE-2020-25695)
修复 pg_dump、pg_restore、clusterdb、reindexdb 和 vacuumdb 对复杂连接字符串参数的使用(Tom Lane) § §
pg_dump 和 pg_restore 的 -d 参数,以及其他上述程序的 --maintenance-db 参数,可以是包含多个连接参数的“连接字符串”,而不仅仅是数据库名称。当这些程序需要发起额外连接时,例如进行并行处理或处理多个数据库时,连接字符串会被遗忘,额外连接只会使用基本连接参数(数据库名称、主机、端口和用户名)。如果连接字符串包含其他必要信息,例如非默认的 SSL 或 GSS 参数,这可能导致连接失败。更糟的是,连接可能成功建立,却未按预期加密,或者可能遭受本应由指定连接参数防止的中间人攻击。(CVE-2020-25694)
当 psql 的 \connect 命令复用连接参数时,确保复用先前连接字符串中所有未被覆盖的参数(Tom Lane) §
这可以避免因遗漏相关参数(例如非默认的 SSL 或 GSS 选项)而导致重新连接失败。更糟的情况是,重新连接可能成功,却未按预期加密,或者可能遭受本应由指定连接参数防止的中间人攻击。这与刚才提到的 pg_dump 等程序的问题基本相同,只是 psql 的行为更复杂,因为用户可能有意覆盖某些连接参数。(CVE-2020-25694)
防止 psql 的 \gset 命令修改具有特殊处理方式的变量(Noah Misch) §
不带前缀的 \gset 会覆盖服务器要求其设置的任何变量。因此,被攻陷的服务器可以设置 PROMPT1 等受到特殊处理的变量,从而能够在用户会话中执行任意 shell 代码。
PostgreSQL 项目感谢 Nick Cleaton 报告此问题。(CVE-2020-25696)
修复对复制协议的意外破坏(Álvaro Herrera) § §
WAL 发送进程 会为 START_REPLICATION 报告两个命令完成事件。这没有文档记录,而且显然并非有意为之,因此我们没有注意到 13.0 后期的一项修改移除了重复事件。然而,事实证明,WAL 接收进程 在某些代码路径中需要这个额外事件。最实际的修复方式是将该额外事件规定为协议的一部分,并恢复生成它。
确保在检查点期间对 SLRU 目录正确执行 fsync(Thomas Munro) §
这可以防止后续操作系统崩溃时可能发生的数据丢失。
修复对具有 BYPASSRLS 属性的用户执行 ALTER ROLE 的行为(Tom Lane,Stephen Frost) §
只有超级用户才可以修改 BYPASSRLS 属性,但其他 ALTER ROLE 操作(例如修改密码)应该只需通过普通权限检查就可以执行。之前的代码错误地将对此类角色的所有修改都限制为只能由超级用户执行。
存在子表时,禁止 ALTER TABLE ONLY ... DROP EXPRESSION(Peter Eisentraut) §
当前实现无法正确处理这种情况,因此暂时将其禁止。
确保 ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER 不递归处理子表(Álvaro Herrera) §
以前,ONLY 标志被忽略了。
允许对自引用视图成功执行 LOCK TABLE(Tom Lane) §
以前会抛出关于无限递归的错误,但似乎没有必要禁止这种情况。
在 REINDEX CONCURRENTLY 前后保留索引的统计信息(Michael Paquier,Fabrízio de Royes Mello) §
非并发的索引重建一直会保留这些统计信息。
修复 REINDEX CONCURRENTLY 不正确的进度报告(Matthias van de Meent,Michael Paquier) §
确保通过规则或可更新视图更新 GENERATED 列所依赖的列时,生成列也得到更新(Tom Lane) §
此修复还处理了在这些情况下可能未能触发特定列触发器的问题。
修复依赖排序规则的分区边界表达式所导致的失败(Tom Lane) §
支持对文本数组进行哈希计算(Peter Eisentraut) §
如果数组元素类型支持排序规则,数组哈希就会失败。尤其是,这使文本数组列无法用作哈希分区的分区键。
防止跨类型日期时间比较中的内部溢出(Nikita Glukhov,Alexander Korotkov,Tom Lane) §
以前,将日期与时间戳比较时,如果日期超出了时间戳的有效范围,就会失败。还有一些边界情况涉及接近限值的时间戳在时区转换期间溢出。
修复 to_date() 和 to_timestamp() 将负年份转换为公元前日期时相差一年的错误(Dar Alathar-Yemen,Tom Lane) §
另外,使负年份与显式 “BC” 标记相抵消,得到 AD 年份。
允许 jsonpath 的 .datetime() 方法接受 ISO 8601 格式的时间戳(Nikita Glukhov) § §
SQL 并未要求这样做,但这似乎是合适的,因为我们的 to_json() 函数为了兼容 Javascript,会生成这种时间戳格式。
确保 archive_mode 设为 always 时,备库会归档 WAL 时间线历史文件(Grigory Smolkin,Fujii Masao) §
这一疏漏可能导致后续的 PITR 恢复尝试失败。
修复在使用 kqueue() 的平台上检测 postmaster 过早终止时的边界情况(Thomas Munro) § §
避免排序键为易变表达式时生成不正确的增量排序计划(James Coleman) §
修复 GEQO 规划期间考虑逐分区连接时可能发生的崩溃(Tom Lane) §
修复仅执行清理的 VACUUM 期间对 B-树索引条目数量的统计(Peter Geoghegan) §
确保数据插入 BRIN 索引之前,先将其从 TOAST 表示还原(Tomas Vondra) §
索引条目本不应包含指向行外数据的 TOAST 指针,但 BRIN 没有遵守这一要求。这可能导致 “missing chunk number 0 for toast value NNN” 等错误。(如果现有索引出现这种错误,执行 REINDEX 应该就足以修复。)
修复带缓冲的 GiST 索引构建,使其在索引具有包含列时正常工作(Pavel Borisov) §
修复 pg_hba_file_rules 视图中不具可移植性的 getnameinfo() 用法(Tom Lane) §
在 FreeBSD 11 以及可能的其他平台上,此错误会使该视图的 address 和 netmask 列始终为空。
避免启动并行工作进程时 debug_query_string 为 NULL 所导致的崩溃(Noah Misch) §
避免 BEFORE ROW UPDATE 触发器返回具有已删除列或“缺失”列的表中的“旧”行时发生失败(Amit Langote,Tom Lane) § §
这种阻止更新的方法可能导致崩溃、意外的 CHECK 约束失败或不正确的 RETURNING 输出,因为在这些操作中,“缺失”列会被读取为 NULL。(这里所说的“缺失”列,是指通过 ALTER TABLE ADD COLUMN 添加、具有非 NULL 常量默认值的列。)已删除的列也可能造成问题。
修复 EXPLAIN 对增量排序计划的输出,使其在 XML 输出模式下具有正确的标签嵌套(Daniel Gustafsson) §
避免通过共享内存队列传输很大的数据载荷时发生不必要的失败(Markus Wanner) §
修复 SQL 语言函数在某些情况下遗漏结果数据类型强制转换的问题(Tom Lane) §
根据所涉及的数据类型,这可能导致错误结果或崩溃。
修复 JIT 代码生成中对模板函数属性的不正确处理(Andres Freund) § §
已证实这会在 s390x 上导致崩溃,而且其他平台上很可能也存在其他情况。
改进 PPC 上为 compare_exchange 和 fetch_add 操作生成的代码(Noah Misch) § §
修复 RLS 策略相关的关系缓存内存泄漏(Tom Lane) §
修复 index_get_partition() 在边界情况下的内存泄漏(Justin Pryzby) §
修复 SIGHUP 处理判定某个 GUC 变量的新值必须重启才能应用时出现的小量内存泄漏(Tom Lane) §
修复 PL/pgsql 的 CALL 处理中的内存泄漏(Pavel Stehule,Tom Lane) §
在 Windows 版 libpq 中,每个进程只调用一次 WSAStartup(),完全不调用 WSACleanup()(Tom Lane,Alexander Lakhin) §
以前,libpq 在连接开始时调用 WSAStartup(),在连接清理时调用 WSACleanup()。但调用 WSACleanup() 似乎会干扰程序的其他操作;特别是,我们观察到过无法将预期输出写入 stdout 的罕见失败。省略该调用似乎没有不良影响,因此予以省略。(这还消除了程序执行一连串数据库连接时,反复加载和卸载 DLL 所造成的性能问题。)
修复 ecpg 库在 Windows 上的逐线程初始化逻辑(Tom Lane,Alexander Lakhin) §
多线程 ecpg 应用可能因锁定不正确而偶发行为异常。
在 Windows 上,使 psql 以文本模式而非二进制模式读取反引号命令的输出(Tom Lane) §
这可以确保正确处理换行符。
确保 pg_dump 收集扩展配置表的逐列信息(Fabrízio de Royes Mello,Tom Lane) § §
未能这样做会导致指定 --inserts 时崩溃,或在使用 COPY 重载表数据时生成指定不完整(虽然通常正确)的 COPY 命令。
修复 contrib/pgcrypto 中潜在的内存泄漏(Michael Paquier) §
在 contrib/pgcrypto 中增加对一种不太可能发生的失败情况的检查(Daniel Gustafsson) §
修复最近添加的 timetz 测试用例,使其在美国未实行夏令时期间也能正常工作(Tom Lane) §
将时区数据文件更新到 tzdata 2020d 版,以反映斐济、摩洛哥、巴勒斯坦、加拿大育空地区、麦夸里岛和凯西站(南极洲)的夏令时法规变更,并修正法国、匈牙利、摩纳哥和巴勒斯坦的历史数据。(Tom Lane) § §
将我们使用的时区库副本同步到 IANA tzcode 2020d 版(Tom Lane) § §
这纳入了上游将 zic 默认输出选项从 “fat” 改为 “slim” 的修改。对我们而言,这只是表面上的变化,因为在 v13 之前的分支中,我们仍然选择 “fat” 模式。此项修改还确保 strftime() 只在失败时才改变 errno。