E.6. 版本 9.6.19 #
发布日期:. 2020-08-13
此版本包含自 9.6.18 以来的多种修复。有关 9.6 大版本中新特性的信息,参见第 E.25 节。
E.6.2. 变更
使 contrib 模块的安装脚本更安全(Tom Lane)
如果攻击者能在扩展的目标模式或某个前置扩展的模式中创建对象,就可以对扩展安装脚本发动类似 CVE-2018-1058 所述的攻击。由于扩展的安装通常需要超级用户权限,这就开辟了一条获得超级用户权限的路径。为降低此风险,我们更加谨慎地处理运行安装脚本所用的
search_path;在脚本内禁用check_function_bodies;并修复部分 contrib 模块中使用的目录调整查询以确保其安全。同时提供文档帮助第三方扩展作者使其安装脚本安全。这不是完整的解决方案;依赖其他扩展的扩展如果安装时不小心,仍然可能有风险。(CVE-2020-14350)修复逻辑复制 walsender 在发送 keepalive 消息之后未能发送反馈消息的问题(Álvaro Herrera)
在使用内置逻辑复制时这是个相对次要的问题,因为内置 walreceiver 本来就会相当频繁地发送反馈应答(从而清除错误状态)。但在使用 pglogical 等其他复制系统时,它会导致显著的性能问题。
修复
ts_headline()执行缓慢的问题(Tom Lane)上一批小版本中加入的短语搜索修复可能导致
ts_headline()对长文档花费不合理的时间;更糟的是,该查询在有问题的循环内不可取消。确保
repeat()函数可以被查询取消中断(Joe Conway)修复
numeric类型列并行聚合时对NaN输入的错误处理(Tom Lane)如果某些部分聚合工作者只遇到
NaN而另一些只遇到非NaN,结果的合并是错误的,可能导致错误的总体结果(即本应为NaN时不是)。撤销
EXPLAIN非文本输出格式中对索引名的双重引号(Tom Lane、Euler Taveira)修复
ALTER TABLE中约束重新验证的时机(David Rowley)如果
ALTER TABLE既需要完全重写表内容(例如因为更改列的数据类型),又需要扫描表以重新验证外键或CHECK约束,它有时会以错误的顺序行事,导致诸如 “could not read block 0 in file "base/nnnnn/nnnnn": read only 0 of 8192 bytes” 之类的奇怪错误。正确处理
FROM子句中未展平子SELECT上附加的限定子句中的LATERAL引用(Tom Lane)这一疏漏可能导致查询执行时的断言失败或崩溃。
避免认为从未分析过的外部表有零个元组(Tom Lane)
这主要影响规划器对
GROUP BY将得到的分组数的估计。改进服务器
buffile模块中的错误处理(Thomas Munro)修复了一些 I/O 错误与到达 EOF 无法区分、或者根本不被报告的情况。还在适当之处添加了块号和字节数等细节。
修复
SERIALIZABLE隔离模式下的冲突检查异常(Peter Geoghegan)如果一个并发插入的元组被另一个并发事务更新,而这两个元组版本对当前事务的快照都不可见,序列化冲突检查可能就元组是否与当前事务的结果相关得出错误结论。这可能使一个可序列化事务在不该提交时(本应报序列化错误)成功提交。
避免重复把死 btree 索引条目标记为死(Masahiko Sawada)
虽然功能上无害,但在启用校验和或打开
wal_log_hints时,这会导致无用的 WAL 流量。修复某些代码路径在修改
pg_control之前未获取正确锁的问题(Nathan Bossart、Fujii Masao)这一疏漏可能使
pg_control以不一致的校验和写出,之后可能引起麻烦,包括在下一次pg_control更新之前崩溃时无法重启数据库。修复
currtid()和currtid2()中的错误(Michael Paquier)这些函数(未写入文档且只被古老版本的 ODBC 驱动使用)包含可导致崩溃的编码错误,或者在应用于没有存储的关系时产生诸如 “could not open file” 之类令人困惑的错误消息。
避免在持有自旋锁时调用
elog()或palloc()(Michael Paquier、Tom Lane)与复制槽相关的逻辑有几处违反了这一编码规则。虽然出问题的几率很低,但被调用函数中的错误会导致自旋锁卡死。
在 pg_dump 和 pg_basebackup 中正确报告磁盘空间不足错误(Justin Pryzby、Tom Lane、Álvaro Herrera)
某些代码路径会产生诸如 “could not write file: Success” 之类的可笑报告。
修复同时具有表级权限和列级权限的表的并行恢复(Tom Lane)
表级权限授予必须先被应用,但并行恢复不能可靠地按此排序;这可能导致 “tuple concurrently updated” 错误,或某些列级权限授予消失。修复方法是在归档文件中的此类条目之间包含依赖链接,这意味着必须用修正后的 pg_dump 重新转储,以确保问题不会复发。
确保 pg_upgrade 在目标集簇中运行时
vacuum_defer_cleanup_age被设为零(Bruce Momjian)如果目标集簇的配置被修改为把
vacuum_defer_cleanup_age设为非零值,会妨碍系统目录的冻结正常工作,导致升级以令人困惑的方式失败。确保升级期间覆盖任何此类设置。修复 pg_recvlogical 在退出前排空未决消息的问题(Noah Misch)
没有这一修复,复制发送端可能检测到发送失败并在对复制槽 LSN 位置进行预期的最终更新之前退出。这导致下次连接之后重新传输数据。还可能错过 pg_recvlogical 想消费的最后数据之后发送的错误消息。
修复 pg_rewind 对源数据目录中刚被删除文件的处理(Justin Pryzby、Michael Paquier)
使用在线源数据库工作时,并发文件删除是可能的,但如果删除恰好发生在看到文件目录项与用
stat()检查它之间, pg_rewind 就会困惑。让 pg_test_fsync 在 Windows 上使用二进制 I/O 模式(Michael Paquier)
此前它以文本模式写测试文件,这不能准确反映 PostgreSQL 的实际用法。
修复
contrib/dblink未能正确初始化本地状态的问题(Joe Conway)在恰当的环境组合下,这可能导致
dblink_close()发出意外的远程COMMIT。修复
contrib/pgcrypto对deflate()的误用(Tom Lane)由于错误处理 zlib 的 API 要求,
pgp_sym_encrypt函数可能产生错误的压缩数据。我们没有收到过这个错误在原版 zlib 下显现的报告,但在使用 IBM 的 zlibNX 实现时可以看到。修复
contrib/pgcrypto的pgp_sym_decrypt函数中解压逻辑的边界情况(Kyotaro Horiguchi、Michael Paquier)压缩流可以合法地以空包结束,但解压器未能处理这一点,会抱怨数据损坏。
用 POSIX 标准的
strsignal()取代 BSD 风格的sys_siglist[](Tom Lane)这避免了在非常新的 glibc 版本下的构建失败。
支持用 Microsoft Visual Studio 2015 或更高版本构建我们的 NLS 代码(Juan José Santamaría Flecha、Davinder Singh、Amit Kapila)
避免源代码树之上若干层存在名为
configure的文件时我们的 MSVC 安装脚本可能失败的问题(Arnold Müller)这可能干扰某些通过寻找
configure来识别源代码树顶层的逻辑。