E.53. 版本 9.1.23 #
发行日期:. 2016-08-11
本次发布包含对 9.1.22 的多方面修复。有关 9.1 大版本中新特性的信息,请参见第 E.76 节。.
PostgreSQL 社区将于 2016 年 9 月停止对 9.1.X 版本系列的更新。建议用户尽快更新到较新的版本分支。
E.53.2. 变更
修复嵌套
CASE-WHEN表达式可能被错误评估的问题(Heikki Linnakangas、Michael Paquier、Tom Lane)出现在另一个
CASE的测试值子表达式中的CASE表达式,可能会混淆其自身的测试值是否为空。此外,内联实现CASE表达式所用相等操作符的 SQL 函数时,可能向该 SQL 函数体内CASE表达式中调用的函数传递错误的测试值。如果测试值的数据类型不同,可能导致崩溃;而且此类情况可被滥用以泄露服务器内存的部分内容。(CVE-2016-5423)修复客户端程序对数据库名和角色名中特殊字符的处理(Noah Misch、Nathan Bossart、Michael Paquier)
vacuumdb 及其他客户端程序中的许多地方,可能会被包含双引号或反斜杠的数据库名和角色名弄混。收紧引用规则以使其安全。同时确保当 conninfo 字符串被用作这些程序的数据库名参数时,全程都被正确地如此对待。
修复 psql 的
\connect和\password命令中对成对双引号的处理,使其与文档一致。在 psql 的
\connect命令中引入新的-reuse-previous选项,以显式控制是否复用先前连接的连接参数。(若不使用该选项,则与以前一样,根据数据库名是否看起来像 conninfo 字符串来决定。)这使 pg_dumpall 脚本能够安全地处理包含特殊字符的数据库名。pg_dumpall 现在拒绝处理包含回车或换行的数据库名和角色名,因为在 Windows 上安全地引用这些字符似乎不切实际。将来我们可能会在服务器端拒绝此类名称,但尚未采取这一步骤。
这些被视为安全修复,因为包含特殊字符的恶意构造的对象名,可能在超级用户下次执行 pg_dumpall 或其他例行维护操作时被用于以超级用户权限执行命令。(CVE-2016-5424)
修复对嵌套组合值应用
IS NULL/IS NOT NULL时的边界错误行为(Andrew Gierth、Tom Lane)SQL 标准规定,对于全空值的行,
IS NULL应返回 TRUE(因此ROW(NULL,NULL) IS NULL得到 TRUE),但这并不意味着递归适用(因此ROW(NULL, ROW(NULL,NULL)) IS NULL得到 FALSE)。核心执行器对此处理正确,但某些规划器优化把该测试当作递归的(因而在两种情况下都产生 TRUE),而contrib/postgres_fdw可能产生类似错误行为的远程查询。使
inet和cidr数据类型正确拒绝包含过多冒号分隔字段的 IPv6 地址(Tom Lane)防止
close_ps()(point##lseg操作符)在输入坐标为 NaN 时崩溃(Tom Lane)使其返回 NULL 而不是崩溃。
修复
to_number()中几处一字节缓冲区过读(Peter Eisentraut)在几种情况下,
to_number()函数会从输入字符串中多读取一个字符。如果输入恰好位于内存末尾附近,则有很小的崩溃可能。避免在经过
heap_update()的高开销路径中出现不安全的中间状态(Masahiko Sawada、Andres Freund)以前,这些情况会锁定目标元组(通过设置其 XMAX),但不为该动作记录 WAL,因此如果页面被刷出到磁盘,随后在元组更新完成之前发生数据库崩溃,就有数据完整性问题的风险。
避免在
VACUUM期间消耗事务 ID(Alexander Korotkov)VACUUM中的某些情况会不必要地导致向当前事务分配 XID。通常这可以忽略不计,但如果已接近 XID 回卷限制,在防回卷清理期间消耗更多 XID 就非常糟糕了。避免在
VACUUM FREEZE期间取消热备查询(Simon Riggs, [Aacute]lvaro Herrera)在原本空闲的主库服务器上执行
VACUUM FREEZE可能导致其备库服务器上的查询被不必要地取消。当手动
ANALYZE指定列列表时,不要重置表的changes_since_analyze计数器(Tom Lane)如果只分析部分列,就不应阻止其他列的例行自动分析。
修复
ANALYZE对包含大量空值的唯一或近似唯一列的n_distinct高估(Tom Lane)空值可能被当作它们本身就是不同的值来计数,导致某些类型查询中规划器的严重误估。
防止自动清理为同一共享目录启动多个工作进程([Aacute]lvaro Herrera)
通常这不是什么大问题,因为清理本来就不会花很长时间;但在目录严重膨胀的情况下,这可能导致除一个工作进程外的所有工作进程都在无用地等待,而不是对其他表做有用的工作。
修复
contrib/btree_gin,使其正确处理bigint的最小可能值(Peter Eisentraut)让 libpq 能正确解码来自未来版本服务器的服务器版本号(Peter Eisentraut)
计划在 9.6 之后的版本中把服务器版本号从三段式改为两段式。确保
PQserverVersion()在此类情况下返回正确的值。修复 ecpg 中
unsigned long long数组元素的代码(Michael Meskes)使 pg_basebackup 接受
-Z 0表示不压缩(Fujii Masao)恢复
pg_ctl start -w的旧启发式超时(Tom Lane)9.1.20 采用的新方法在启用
silent_mode时不工作,因此改回旧方法。修复构建 AIX 共享库的 makefile 规则,使其在并行 make 下安全(Noah Misch)
修复 TAP 测试和 MSVC 脚本,使其在构建目录路径名包含空格时也能工作(Michael Paquier、Kyotaro Horiguchi)
使回归测试在丹麦语和威尔士语区域设置下安全(Jeff Janes、Tom Lane)
修改了一些会触发这些区域设置特殊排序规则的测试数据。
更新我们的时区代码副本,以匹配 IANA 的 tzcode 2016c 版(Tom Lane)
这是为了应对时区数据文件未来预期的变更。它还修复了处理特殊时区方面的一些边界 bug。
把时区数据文件更新到 tzdata 2016f 版,涉及克麦罗沃和新西伯利亚的夏令时法规变更,以及阿塞拜疆、白俄罗斯和摩洛哥的历史数据修正。