发布日期:. 2015-05-22
这个版本包含各种自9.0.19以来的修复。关于9.0主版本的新特性信息, 请查看第 E.131 节。
PostgreSQL社区将在2015年9月停止发布9.0.X版本系列的更新。 建议用户尽快更新到一个新的版本分支。
避免客户端正好在认证超时前断开连接时可能的崩溃 (Benkocs Norbert Attila)
如果超时中断在会话关闭序列的一半触发,那么SSL相关的状态会被触发两次, 通常导致崩溃,并且因此拒绝其他会话的服务。实验证明, 一个未经过验证的远端攻击会始终触发这个bug,因此将其看做是安全问题。 (CVE-2015-3165)
提高系统调用失败的检测 (Noah Misch)
我们snprintf()
的替代实现未能检查底层系统库调用报告的错误;
可能错过的主要情况是内存溢出。在最糟糕的情况下,这会导致信息暴露,
因为我们的代码在缓冲区还未写满的情况下就假设它已经被写满了。
另外,还有几个地方没有检查其他系统库函数安全相关的调用的失败。
如果内存溢出在不当的时间发生,仍然有可能有一些*printf()
这一类的函数调用容易受到信息暴露的危险。
我们判断该风险不算大,但是将继续分析这个问题。 (CVE-2015-3166)
在contrib/pgcrypto
中,一致的报告解密失败为
“错误的秘钥或数据损坏” (Noah Misch)
以前,一些错误秘钥解密的情况会报告其他错误消息文本。
已经显示这样的错误报告变化会帮助攻击者从其他的系统中恢复秘钥。
虽然pgcrypto
的特定行为是否同样可以利用还是未知,
但是最好通过使用通用的消息避免该风险。 (CVE-2015-3167)
修复HOT更新之后延迟排除约束的不正确的检查 (Tom Lane)
如果一个可能违反延迟的排除约束的新行稍后在同一个事务中HOT更新了 (也就是,没有改变索引列,并且该行可以存储到相同的表页上), 那么在检查时会报告违反该排除约束,即使该行最初与已经删掉的那行冲突。
阻止针对其他外连接的反连接(NOT EXISTS连接)的不正确的重新排序 (Tom Lane)
已经观察到规划器中的这个疏忽会导致“could not find RelOptInfo for given relids” 错误,但是有时一个不正确的查询规划通过一致性检查并导致错误的查询结果看起来也是可能的。
修复外连接查询节点中子表达式的错误匹配 (Tom Lane)
以前,如果文本相同的非严格子表达式用在外连接的上面和下面, 规划器会尝试重利用连接下面计算出来的值,这是不正确的, 因为执行器会在不匹配外部行的情况下强制该值为NULL。
修复GEQO规划器,以处理它的连接顺序启发式错误 (Tom Lane)
已经观察到这个疏忽会在包含LATERAL
的查询中导致
“未能连接所有关系”,并且在其他情况下也有可能发生。
修复max_prepared_transactions
很小时启动中可能的死锁 (Heikki Linnakangas)
在切换时间线之后,不要归档无用的预先分配的WAL文件 (Heikki Linnakangas)
避免“在恢复期间不能GetMultiXactIdMembers()”错误 (Álvaro Herrera)
在崩溃后递归的fsync()
数据目录
(Abhijit Menon-Sen, Robert Haas)
如果另外一个崩溃稍后发生,这样可以确保一致性。 (第二个崩溃必须是系统级别的崩溃,不只是数据库崩溃,所以这是一个问题。)
如果一个错误发生在启动器接收到SIGTERM之后,修复自动清理启动器的未能关闭 (Álvaro Herrera)
处理LockBufferForCleanup()
中意外的信号 (Andres Freund)
这个疏忽会导致关于“多个后端尝试等待pincount 1”的虚假错误。
避免在用户只读的事务提交期间等待WAL冲刷或同步复制 (Andres Freund)
以前,延迟会发生在由于HOT页面修剪写入WAL的事务提交时,导致不良影响, 比如如果所有同步副本都记录了,会话在启动时卡住。 还观察到,会话在使用同步复制时遇到中断处理也会卡住; 这个问题也会得到修复。
修复在临时表上操作哈希索引时的崩溃 (Heikki Linnakangas)
修复哈希索引桶分裂期间可能的失败,如果其他处理正在并发的修改该索引 (Tom Lane)
在分析索引表达式时检查中断 (Jeff Janes)
ANALYZE
多次执行索引表达式;如果在这样的表达式中有慢函数,
它需要在循环完成之前能够取消ANALYZE
。
添加目标服务器的名字到对象描述字符串,用于外部服务器用户映射 (Álvaro Herrera)
在使用Kerberos/GSSAPI/SSPI认证时,推荐设置include_realm
为1 (Stephen Frost)
如果不这样设置,就无法区分来自不同领域的同名用户。目前为止, 这仅仅是一个文档修改,但是它在PostgreSQL 9.5 中将会时缺省设置。
删除匹配IPv4 pg_hba.conf
项到IPv4-in-IPv6地址的代码 (Tom Lane)
这个方法是在2003年添加的,回应一些Linux内核在当时报告IPv4连接拥有
IPv4-in-IPv6地址的报告。不过,这个逻辑在9.0偶然打破了。
自此之后,缺少了现场抱怨,显示不是那么需要它了。
现在我们已经记录了该破损的代码在某些系统上导致崩溃,
所以我们删掉它而不是修复它。(如果我们选择修复它,
在IPv4 pg_hba.conf
项的影响意义上会有微妙和潜在的安全敏感改变,
在小版本中做这件事似乎不太好。)
当在Windows上关闭服务时,定期的发送状态更新到服务控制管理器, 阻止它太快的杀死服务;并且确保pg_ctl 将等待关闭 (Krystian Bigaj)
在使用libpq的非阻塞模式时,减少网络死锁的风险 (Heikki Linnakangas)
当发送大量的数据时,偶尔排空输入缓冲区是非常重要的,
以防服务器发送了很多响应数据导致它阻塞输出。(一个典型的情况是服务器在
COPY FROM STDIN
期间发送了一连串的NOTICE消息。)
在普通阻塞模式下这可以正确的工作,但是在非阻塞模式下不能这样。
我们已经修改了libpq,在它可以时排空输入,
但是全面防御这个问题还需要应用支持:应用应该等待套接字准备好读和准备好写条件,
并且保证在准备好读时调用PQconsumeInput()
。
修复ecpg中的数组处理 (Michael Meskes)
修复psql,以稳健的处理URI和conninfo字符串作为
\connect
的第一个参数 (David Fetter, Andrew Dunstan, Álvaro Herrera)
已经接受这个语法很长时间了(但是没有记录), 但是以前一些参数可能会从老的连接中获取,而不是来自给出的字符串, 这是不可取的。
废除某些平台上来自psql的在退出时未能写入
~/.psql_history
的不正确的抱怨 (Tom Lane)
这个错误行为是由于一个非常老(2006以前)的libedit 版本的bug变通方案引起的。我们通过移除该变通方案修复它, 这将导致仍然使用这个libedit版本的用户出现类似的错误。 建议:升级该库,或者使用libreadline。
修复pg_dump决定哪个转换是系统提供的转换, 不应该被抛弃的规则 (Tom Lane)
修复仅有VALUES(...)
但是有字段别名的视图的转储 (Tom Lane)
在pg_upgrade中,强制 timeline 1 在新的集群中 (Bruce Momjian)
这个修改阻止了由于关于错误WAL历史文件的虚假抱怨引起的升级失败。
在pg_upgrade中,在处理之前,检查不适当的非可连接数据库 (Bruce Momjian)
在pg_upgrade中,在生成的delete_old_cluster
脚本中正确的引用目录路径 (Bruce Momjian)
在pg_upgrade中,适当的保护数据库级别的冻结信息 (Bruce Momjian)
这个疏忽会导致postgres
和template1
数据库中的表丢失clog文件错误。
在Windows上用受限制的权限运行pg_upgrade和pg_resetxlog, 这样在通过管理员运行时,它们不会失败 (Muhammad Asif Naeem)
修复contrib/intarray
中缓慢的排序算法 (Tom Lane)
修复Sparc V8机器上的编译失败 (Rob Rowan)
更新时区数据文件到tzdata版本2015的, 因为DST规律在Egypt、Mongolia和Palestine发生了改变, 加上Canada和Chile的历史变化。还采取了America/Adak时区改进的时区缩写 (是HST/HDT不是HAST/HADT)。