E.91. 版本 9.1.16

E.91.1. 迁移到版本 9.1.16
E.91.2. 修改列表

发布日期:. 2015-05-22

这个版本包含各种自9.1.15以来的修复。关于9.1主版本的新特性信息, 请查看第 E.107 节

E.91.1. 迁移到版本 9.1.16

运行9.1.X版本的用户不需要转储/恢复。

如果你使用了contrib/citextregexp_matches()函数, 请查看下面关于它的修改日志项。

另外,如果你是从一个早于9.1.14的版本升级而来, 那么请查看第 E.93 节

E.91.2. 修改列表

  • 避免客户端正好在认证超时之前断开连接时可能的崩溃 (Benkocs Norbert Attila)

    如果超时中断在会话关闭序列的中途触发,SSL相关的状态将被释放两次, 通常导致崩溃并且因此拒绝其他会话的服务。实验显示, 未认证的远端攻击会一致的触发该bug,因此将其看做是安全问题。 (CVE-2015-3165)

  • 改善对系统调用失败的检测 (Noah Misch)

    我们的snprintf()的替代实现未能检查底层系统库调用报告的错误; 可能丢失的主要情况是内存溢出情况。在最坏的情况下,可能会导致信息暴露, 因为我们的代码假设缓冲区已经被重写,但是实际上它没有。 另外,还有几个地方有其他系统库函数安全相关的调用,也没有失败检测。

    如果内存溢出错误正好发生在错误的时间,*printf() 家族函数的某些调用仍然有可能会信息暴露。我们判断该风险不大, 但是将继续分析。 (CVE-2015-3166)

  • contrib/pgcrypto中,统一报告解密失败为 Wrong key or corrupt data (Noah Misch)

    以前,错误秘钥解密的一些情况会报告其他的错误消息。已经显示, 错误报告中这样的变化会帮助攻击者从其他系统中恢复秘钥。 虽然还不知道pgcrypto的具体行为否是可以相似的利用, 但是看起来最好是通过使用通用的消息避免该风险。 (CVE-2015-3167)

  • 修复contrib/citextregexp_matches() 函数的不正确的声明 (Tom Lane)

    这些函数应该返回setof text[],就像它们封装的那些内核函数; 但是它们错误的声明为只返回text[]。这个错误有两种结果: 首先,如果没有匹配,你获得一个标量的空结果,而你应该获得一个空集(零行)。 其次,有效的忽略g标志,因此你应该获得一个结果数组, 即使有多个匹配。

    后者的行为显然是一个错误,可能有应用依赖于前者的行为; 因此该函数的声明缺省是不能改变的,直到PostgreSQL 9.5。 在9.5之前,老的行为存在于citext扩展的1.0版本中, 我们在版本1.1中提供了纠正的声明(缺省安装)。 要在9.5之前的分支中采取该修复,在每个安装了citext 的数据库中执行ALTER EXTENSION citext UPDATE TO '1.1'。 (如果你要取消操作,可以更新回到1.0。) 请注意,任一更新指导都将需要删除和重建使用citextregexp_matches()函数的任意视图或规则。

  • 修复HOT更新之后对延迟排除约束的不正确的检查 (Tom Lane)

    如果一个潜在违反了延迟排除约束的新行是稍后在同一个事务中HOT更新的(也就是, 非索引的字段修改和该行可以存储回相同的表页上), 当检查最终发生时,将报告违反了排除约束,即使新行本来就与已经删除了的行冲突。

  • 阻止反连接(NOT EXISTS链接)对其他外连接的不正确的重新排序 (Tom Lane)

    已经观察到规划器中的这个疏忽会导致could not find RelOptInfo for given relids错误, 但是有时一个不正确的查询规划会通过一致性检查并且导致错误的查询输出是可能的。

  • 修复外连接规划节点中子表达式的错误匹配 (Tom Lane)

    以前,如果文本相同的非严格子表达式同时用于外连接的上面和下面, 规划器可能会尝试重新使用连接下面计算出来的值,这是不正确的, 因为执行器在外部行不匹配的情况下将强制该值为NULL。

  • 修复GEQO规划器,处理它的连接顺序启发失败 (Tom Lane)

    已经观察到这个疏忽会导致包含LATERAL查询中的failed to join all relations together错误,也有可能会在其他情况下发生。

  • 修复max_prepared_transactions太小时,启动时可能的死锁 (Heikki Linnakangas)

  • 不要归档,除非预先分配的WAL文件在时间线切换之后 (Heikki Linnakangas)

  • 避免cannot GetMultiXactIdMembers() during recovery错误 (Álvaro Herrera)

  • 崩溃之后递归的fsync()数据目录 (Abhijit Menon-Sen, Robert Haas)

    如果另外一个崩溃稍后就发生了,这能确保一致性。(第二个崩溃必须是一个系统级的崩溃, 而不只是数据库崩溃,所以这是一个问题。)

  • 修复自动清理启动器接收到SIGTERM之后发生了一个错误时,可能的未能关闭 (Álvaro Herrera)

  • 处理LockBufferForCleanup()中意外的信号 (Andres Freund)

    这个疏忽会导致关于multiple backends attempting to wait for pincount 1的假错误。

  • 避免在提交用户关心的只读事务期间等待WAL刷新或同步复制 (Andres Freund)

    以前,在由于HOT页修改而写入WAL的事务中,在提交时会发生延迟, 导致不良影响,比如如果做了所有同步复制,会话会卡在启动时。 还观察到在使用同步复制时,会话会卡在追赶中断处理时; 这个修改也修复了这个问题。

  • 修复在临时表上操作哈希索引时的崩溃 (Heikki Linnakangas)

  • 修复哈希索引桶分裂期间可能的失败,如果其他处理正在并发的修改该索引 (Tom Lane)

  • 在分析索引表达式时检查中断 (Jeff Janes)

    ANALYZE执行索引表达式多次;如果在这样的表达式中有一个缓慢的函数, 在循环终止之前取消ANALYZE是合理的。

  • READ COMMITTED检查发生在在SELECT FOR UPDATEUPDATEDELETE中锁定了行之后时, 确保正确的报告外表的tableoid (Etsuro Fujita)

  • 添加目标服务器的名字到对象描述字符串,用于外部服务器用户映射 (Á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项的有效意义中可能会有安全敏感的修改, 这在小版本中做看起来不是一件好事。)

  • 报告WAL刷新,不是插入,位于IDENTIFY_SYSTEM复制命令中 (Heikki Linnakangas)

    这避免了pg_receivexlog中可能的启动失败。

  • 当在Windows上关闭了服务时,定期发送状态更新到服务控制管理器, 阻止太快的杀死服务;并确保pg_ctl等待关闭 (Krystian Bigaj)

  • 在使用libpq的非阻塞模式时,降低网络死锁的风险 (Heikki Linnakangas)

    在发送大量的数据时,常常排空输入缓冲区是非常重要的, 以防服务器发送了大量响应数据导致阻塞输出。(一个典型的情况是服务器在 COPY FROM STDIN期间发送了一连串NOTICE消息。) 这在普通阻塞模式下运行正常,但是在非阻塞模式下不行。 我们已经修改了libpq,在可以时排空输入, 但是完全防卫该问题需要应用合作:应用应该等待套接字读准备好和写准备好条件, 并且在读准备好时确保调用PQconsumeInput()

  • 修复ecpg中的数组处理 (Michael Meskes)

  • 修复psql,理智的处理URIs和conninfo字符串为\connect 的第一个参数 (David Fetter, Andrew Dunstan, Álvaro Herrera)

    已经接受这个语法很长时间了(但是未记录),但是以前一些参数可能来自老的连接, 而不是给定的字符串,这是不可取的。

  • 抑制某些在退出时未能写入~/.psql_history的平台上, 来自psql的不正确的抱怨 (Tom Lane)

    这个错误行为是由于在非常老的libedit版本(2006之前) 中绕开一个错误引起的。我们通过删除该绕开来修复它, 这将导致仍然使用这个版本的libedit的用户出现类似的失败。 建议:升级该库,或使用libreadline

  • 修复pg_dump决定哪个转换是系统提供的转换, 不需要转储的规则 (Tom Lane)

  • pg_dump中,修复未能遵守-Z-Fd 压缩级别选项 (Michael Paquier)

  • 在选择转储顺序时,让pg_dump考虑扩展配置表之间的外键关系 (Gilles Darold, Michael Paquier, Stephen Frost)

    这个疏忽会导致生产转储未能重载,因为暂时违反外键约束。

  • 修复仅有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)

    这个疏忽会导致postgrestemplate1 数据库中的表missing-clog-file错误。

  • 用受限制的权限在Windows上运行pg_upgradepg_resetxlog, 这样在通过管理员运行时,它们不会失败 (Muhammad Asif Naeem)

  • 改善扫描initdbpg_basebackup 中的目录时,对readdir()失败的处理 (Marco Nenciarini)

  • 修复contrib/intarray中的缓慢排序算法 (Tom Lane)

  • 修复Sparc V8机器上的编译失败 (Rob Rowan)

  • 更新时区数据文件到tzdata版本2015d,因为DST规律在Egypt、 Mongolia和Palestine发生了改变,加上Canada和Chile的历史修改。 还采取了America/Adak时区改进的时区缩写 (HST/HDT not HAST/HADT).