E.22. 版本 9.4.5 #
发布日期:. 2015-10-08
本发行版包含对 9.4.4 的多项修复。有关 9.4 主版本中新功能的信息,请参见第 E.27 节。
E.22.2. 变更
防御
json解析中的栈溢出(Oskari Saarenmaa)如果应用程序从任意用户输入构造 PostgreSQL
json或jsonb值,应用程序的用户就能可靠地使 PostgreSQL 服务器崩溃,造成短暂的服务拒绝。(CVE-2015-5289)修复
contrib/pgcrypto以检测并报告过短的crypt()盐值(Josh Kupershmidt)某些无效的盐值参数会导致服务器崩溃或泄露少量服务器内存字节。我们尚未排除通过安排让泄露字节中出现机密信息实施攻击的可行性,但这种攻击似乎不太可能。(CVE-2015-5288)
修复属于外部子事务的门户(游标)失败后的子事务清理问题(Tom Lane、Michael Paquier)
在外部子事务游标中执行的函数可能因引用在内部子事务中创建的关系而导致断言失败或崩溃。
修复设置了
commit_delay时 WAL 插入期间可能的死锁(Heikki Linnakangas)确保更新语句期间对可更新视图引用的所有关系正确加锁(Dean Rasheed)
修复关系插入关系缓存“init 文件”的问题(Tom Lane)
最近几个小版本中一个补丁的疏忽导致
pg_trigger_tgrelid_tgname_index被遗漏在 init 文件之外。后续会话检测到这一点后认定 init 文件已损坏并静默忽略它,导致会话启动时间显著退化。除修复该缺陷外,还加入了一些防护,使未来任何类似错误更明显。避免向 SPI 查询结果插入大量元组时的 O(N^2) 行为(Neil Conway)
改进存在大量未读通知时
LISTEN的启动时间(Matt Newell)修复会话更改大量外键约束时的性能问题(Jan Wieck、Tom Lane)
这主要在还原拥有数千张表的数据库的pg_dump输出时出现。
默认禁用 SSL 重新协商(Michael Paquier、Andres Freund)
虽然使用 SSL 重新协商在理论上是个好主意,但实践中我们看到了太多缺陷,无论是底层 OpenSSL 库中还是我们对它的使用中。重新协商将在 9.5 及更高版本中完全移除。在较旧的分支中,只是把
ssl_renegotiation_limit的默认值改为零(禁用)。降低
*_freeze_max_age参数的最小值(Andres Freund)这主要是为了使相关行为的测试不那么耗时,但对磁盘空间有限的安装也可能有价值。
将
wal_buffers的最大值限制为 2GB 以避免服务器崩溃(Josh Berkus)避免当只能在服务器启动时设置的参数在
postgresql.conf中多次出现时记录抱怨日志,并修复include_dir指令之后的行号计数(Tom Lane)修复
numeric值乘法中罕见的内部溢出(Dean Rasheed)防范涉及记录类型、范围类型、
json、jsonb、tsquery、ltxtquery和query_int的难以触发的栈溢出(Noah Misch)修复日期时间输入中
DOW和DOY的处理(Greg Stark)这些记号本不应在日期时间值中使用,但过去它们导致的是难懂的内部错误消息,而不是“无效的输入语法”。
为正则表达式匹配添加更多查询取消检查(Tom Lane)
为正则表达式、
SIMILAR TO和LIKE匹配增加递归深度保护(Tom Lane)合适的搜索模式加上较低的栈深度限制可能导致栈越界崩溃。
修复正则表达式执行中潜在的无限循环(Tom Lane)
一个表面上能匹配零长度字符串、但实际上因反向引用而不匹配的搜索模式可能导致无限循环。
在正则表达式执行中,即使匹配长度为零,也正确记录量词内捕获括号的匹配数据(Tom Lane)
修复正则表达式编译中的内存不足失败(Andreas Seltenreich)
修复正则表达式执行期间低概率的内存泄漏(Tom Lane)
修复事务中止期间锁清理中罕见的内存不足失败(Tom Lane)
修复使用较小
work_mem设置的元组存储时出现的 “unexpected out-of-memory situation during sort” 错误(Tom Lane)修复
qsort中概率极低的栈越界(Tom Lane)修复使用较大
work_mem设置的哈希连接中出现的 “invalid memory alloc request size” 失败(Tomas Vondra、Tom Lane)修复若干规划器缺陷(Tom Lane)
这些错误可能导致给出错误结果的错误查询计划、启用断言的构建中的断言失败,或奇怪的规划器错误,例如“could not devise a query plan for the given query”、“could not find pathkey item to sort”、“plan should not reference subplan's variable”或“failed to assign all NestLoopParams to plan nodes”。感谢 Andreas Seltenreich 和 Piotr Stefaniak 通过模糊测试暴露了这些问题。
改进规划器在大型继承集上执行
UPDATE/DELETE的性能(Tom Lane、Dean Rasheed)确保在 postmaster 启动时移除备库提升触发文件(Michael Paquier、Fujii Masao)
这可以防止这些文件出现在用于初始化新备库服务器的数据库备份中时发生不需要的提升。
在 postmaster 关闭期间,确保在移除
postmaster.pid文件之前移除各套接字的锁文件并关闭监听套接字(Tom Lane)这可以避免外部脚本在
pg_ctl stop一返回就尝试启动新 postmaster 时出现竞争条件失败。确保 postmaster 直到其所有子进程都退出后才退出,即使在立即关闭时也是如此(Tom Lane)
与上一条类似,这避免了与随后启动的 postmaster 之间可能出现的竞态条件。
修复 postmaster 对崩溃恢复期间启动进程崩溃的处理(Tom Lane)
如果在崩溃恢复周期中,启动进程在尚未恢复数据库一致性时崩溃,我们会尝试启动一个新的启动进程,而这通常只会再次崩溃,导致无限循环。
使针对多事务 ID 回卷的紧急自动清理更加健壮(Andres Freund)
当我们试图向某个自动清理工作进程发送信号而它已经不在时,不再打印
WARNING,并降低此类信号的日志详细程度(Tom Lane)防止自动清理启动器在服务器时钟被大幅回拨时睡眠过长时间(Álvaro Herrera)
确保 GIN 索引的待处理插入列表清理可被取消请求中断(Jeff Janes)
允许重用 GIN 索引中的全零页(Heikki Linnakangas)
崩溃之后可能遗留这样的页。
修复 SP-GiST 索引中对全零页的处理(Heikki Linnakangas)
VACUUM曾试图回收此类页,但方式并非崩溃安全。修复一个差一错误,该错误导致子事务/多事务截断中出现关于 “apparent wraparound” 的原本无害的警告(Thomas Munro)
修复 PL/pgSQL 错误上下文消息中对
CONTINUE和MOVE语句类型的误报(Pavel Stehule、Tom Lane)修复 PL/Perl 使其正确处理非 ASCII 的错误消息文本(Alex Hunsaker)
修复 PL/Python 返回
record结果的字符串表示时的崩溃(Tom Lane)修复 PL/Tcl 中一些未检查
malloc()调用失败之处(Michael Paquier, Álvaro Herrera)在
contrib/isn中,修复以 979 开头的 ISBN-13 号码的输出(Fabien Coelho)以 979(但不以 9790)开头的 EAN 被视为 ISBN,但它们必须以新的 13 位格式而非 10 位格式打印。
改进
contrib/pg_stat_statements对查询文本垃圾回收的处理(Peter Geoghegan)包含查询文本的外部文件可能膨胀到非常大的尺寸;一旦超过 1GB,修剪它的尝试就会失败,很快就会导致该文件完全无法读取的情况。
改进
contrib/postgres_fdw对排序规则相关决策的处理(Tom Lane)预期主要的用户可见效果是:涉及
varchar列的比较将比以前在更多情况下被发送到远程服务器执行。改进 libpq 对内存不足情况的处理(Michael Paquier、Heikki Linnakangas)
修复 ecpg 中的内存泄漏和缺失的内存不足检查(Michael Paquier)
修复 psql 中对数字输出的区域感知格式化代码(Tom Lane)
\pset numericlocale on所调用的格式化代码在一些不常见的情况下会出错,例如带指数但没有小数点的数字。它还可能破坏money数据类型已经区域化的输出。防止 psql 的
\c命令在没有当前连接时崩溃(Noah Misch)使 pg_dump 正确处理继承的
NOT VALID检查约束(Tom Lane)修复 pg_dump 目录输出格式中默认 zlib 压缩级别的选择(Andrew Dunstan)
确保 pg_dump 以 tar 格式输出运行期间创建的临时文件不会被所有用户读取(Michael Paquier)
修复 pg_dump 和 pg_upgrade,以支持
postgres或template1数据库位于非默认表空间的情况(Marti Raudsepp、Bruce Momjian)修复 pg_dump 从过于陈旧而没有特定权限类型的服务器转储时对对象权限的处理(Tom Lane)
从 9.2 之前的服务器转储数据类型,以及从 7.3 之前的服务器转储函数或过程语言时,pg_dump 会生成撤销所有者可授予权限、转而将所有权限授予
PUBLIC的GRANT/REVOKE命令。由于所涉及的权限只是USAGE和EXECUTE,这不构成安全问题,但这种表示与旧系统的行为明显不符。现已修复,在这些情况下保持默认权限状态不变。修复pg_dump以转储 shell 类型(Tom Lane)
shell 类型(即尚未完全定义的类型)用处不大,但pg_dump仍应转储它们。
修复 pg_dump 和其他客户端程序中的各种轻微内存泄漏(Michael Paquier)
修复查询或 pgbench 自身卡住时 pgbench 的进度报告行为(Fabien Coelho)
修复 Alpha 硬件的自旋锁汇编代码(Tom Lane)
修复 PPC 硬件的自旋锁汇编代码使其与AIX本机汇编器兼容(Tom Lane)
如果gcc被配置为使用本机汇编器(这正变得越来越普遍),则用gcc构建无法工作。
在 AIX 上,测试
-qlonglong编译器选项,而不是仅仅假定可以安全使用(Noah Misch)在AIX上,使用
-Wl,-brtllib链接选项以允许符号在运行时解析(Noah Misch)Perl 5.8.0 及更高版本依赖这一能力。
使用 32 位 xlc 编译时避免使用内联函数,因为编译器存在缺陷(Noah Misch)
必要时使用
librt提供sched_yield(),在某些 Solaris 版本上正是如此(Oskari Saarenmaa)将编码
UHC按 Windows 代码页 949 处理(Noah Misch)这修复了未附属到任何特定数据库的进程(如 postmaster)发出的非 ASCII 日志消息的呈现。
在 Windows 上,避免在事务之外(例如为日志消息)进行到 UTF16 的编码转换时失败(Noah Misch)
修复因未复制
setlocale()返回值导致的 postmaster 启动失败(Noah Misch)这在 ANSI 代码页设为 CP936(“简体中文(中华人民共和国)”)的 Windows 系统上曾有报告,其他多字节代码页也可能出现。
修复 Windows
install.bat脚本以处理包含空格的目标目录名(Heikki Linnakangas)使 PostgreSQL 版本号的数字形式(例如
90405)以名为VERSION_NUM的变量方便地供扩展 Makefile 使用(Michael Paquier)将时区数据文件更新到 tzdata 发行版 2015g,涵盖开曼群岛、斐济、摩尔多瓦、摩洛哥、诺福克岛、朝鲜、土耳其和乌拉圭的夏令时法规变更。为加拿大北部落基山脉新增了时区名
America/Fort_Nelson。