E.5. 版本 9.6.4

E.5.1. 迁移到版本 9.6.4
E.5.2. 修改列表

发布日期: 2017-08-10

此版本包含来自9.6.3的各种修补程序。 关于9.6主版本中的新特性信息,请查看 第 E.9 节

E.5.1. 迁移到版本 9.6.4

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

但是,如果您使用使用用户密码进行身份验证的外部数据服务器, 请参阅下面的第一个更改日志条目。

另外,如果您从早于9.6.3的版本进行升级, 请查看第 E.6 节

E.5.2. 修改列表

  • 进一步限制pg_user_mappings.umoptions 的可见性,以保护存储为用户映射选项的密码 (Noah Misch)

    CVE-2017-7486的修补程序不正确:它允许用户在自己的用户映射中查看选项, 即使她在关联的外部服务器上没有USAGE权限也是如此。 这些选项可能包括服务器所有者提供的密码,而不是用户自己提供的密码。 由于information_schema.user_mapping_options 在这种情况下不显示选项,所以pg_user_mappings也不应该。 (CVE-2017-7547)

    就其本身而言,该修补程序将仅修复新initdb的数据库中的行为。 如果您希望在现有数据库中应用此更改,则需要执行以下操作:

    1. 在将allow_system_table_mods = true添加到 postgresql.conf之后重启postmaster。 (在支持ALTER SYSTEM的版本中,可以使用它使配置更改, 但是仍然需要重启。)

    2. 在集群的每个数据库中, 作为超级用户运行下列命令:

      SET search_path = pg_catalog;
      CREATE OR REPLACE VIEW pg_user_mappings AS
          SELECT
              U.oid       AS umid,
              S.oid       AS srvid,
              S.srvname   AS srvname,
              U.umuser    AS umuser,
              CASE WHEN U.umuser = 0 THEN
                  'public'
              ELSE
                  A.rolname
              END AS usename,
              CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
                           AND (pg_has_role(S.srvowner, 'USAGE')
                                OR has_server_privilege(S.oid, 'USAGE')))
                          OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
                          OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                          THEN U.umoptions
                       ELSE NULL END AS umoptions
          FROM pg_user_mapping U
               LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
              pg_foreign_server S ON (U.umserver = S.oid);

    3. 不要忘记包括template0template1数据库, 否则隐患仍然存在于你稍后创建的数据库中。要修复template0, 你需要临时允许它接受连接。在PostgreSQL 9.5和更高版本中, 你可以使用

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

      然后再修复template0之后,使用下面的命令取消设置

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;

      在以前的版本中,使用

      UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
      UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

    4. 最后,删除allow_system_table_mods配置设置,再次重启postmaster。

  • 禁止在所有基于密码的身份验证方法中使用空密码 (Heikki Linnakangas)

    libpq忽略空密码规范,并且不会将它们传输到服务器。 因此,如果用户的密码已设置为空字符串,则无法通过psql 或其他基于libpq的客户端使用该密码登录。 管理员可能认为将密码设置为空将与禁用密码登录等效。但是, 对于基于修改或非基于libpq的客户端, 根据配置的身份验证方法,可能可以进行登录。特别是最常见的方法,即md5 接受空密码。在所有情况下更改服务器拒绝空密码。 (CVE-2017-7546)

  • lo_put()检查目标大对象上的UPDATE权限 (Tom Lane, Michael Paquier)

    lo_put()当然需要与lowrite()相同的权限, 但该检查缺失,允许任何用户更改大对象中的数据。 (CVE-2017-7548)

  • 使用pg_upgrade 更正有关升级备用服务器的过程的文档 (Bruce Momjian)

    以前的文档指导用户在运行pg_upgrade 之后但在同步备用服务器之前启动/停止主服务器。这个顺序是不安全的。

  • 修复元组更新链的并发锁定 (Álvaro Herrera)

    如果多个会话使用旧快照同时锁定元组更新链并且使用非冲突锁定模式,并且它们全部成功, 但由于竞争条件,它们中的一些可能会失败(并且得出结论,没有活动的元组版本)。 这具有诸如外键检查未能看到确实存在但正在被同时更新的元组的后果。

  • 修复冻结一个元组(whose XMAX is a multixact with exactly one still-interesting member) 时潜在的数据损坏 (Teodor Sigaev)

  • 在内存中对超过10亿个元组进行排序时,避免整数溢出并导致崩溃 (Sergey Koposov)

  • 在Windows上,如果我们未能在新进程中保留共享内存的地址范围,请重试进程创建 (Tom Lane, Amit Kapila)

    预计这将修复罕见的子进程启动失败,这可能是由于防病毒产品的干扰造成的。

  • 修复Windows构建中共享谓词锁散列表的低概率损坏 (Thomas Munro, Tom Lane)

  • 避免记录干净的SSL连接关闭,就像连接重置一样 (Michael Paquier)

  • 阻止向客户端发送SSL会话票据 (Tom Lane)

    此修复程序可防止票证感知的客户端SSL代码重新连接失败。

  • 修复在Solaris上设置tcp_keepalives_idle的代码 (Tom Lane)

  • 修复统计收集器以遵守postmaster关闭和立即重新启动后发出的查询消息 (Tom Lane)

    在之前的postmaster停工半秒内发出的统计查询被有效地忽略了。

  • 确保统计收集器的接收缓冲区大小至少为100KB (Tom Lane)

    这可以降低在默认接收缓冲区大小小于此值的较早平台上丢失统计数据的风险。

  • 修复在备用数据库处理XLOG_SWITCH WAL记录之后立即将其提升时, 创建无效的WAL段的可能性 (Andres Freund)

  • 修复walsender在客户端请求关闭时立即退出 (Tom Lane)

  • 在walsender进程中修复SIGHUPSIGUSR1处理 (Petr Jelinek, Andres Freund)

  • 在关机检查点防止walsender触发的恐慌 (Andres Freund, Michael Paquier)

  • 修复由于postmaster中的争用情况而导致的walreceiver 进程不必要的重启缓慢 (Tom Lane)

  • 修复在逻辑解码过程中溢出到磁盘的小型子事务的泄漏 (Andres Freund)

    这导致临时文件消耗过多的磁盘空间。

  • 减少在创建逻辑解码插槽期间构建快照所需的工作 (Andres Freund, Petr Jelinek)

    以前的算法在有很多开放事务的服务器上是不可行的。

  • 修复可能无限期延迟逻辑解码插槽创建的竞态条件 (Andres Freund, Petr Jelinek)

  • 减少处理系统缓存失效事件的开销 (Tom Lane)

    这对逻辑解码特别有用,它会触发频繁的缓存失效。

  • 删除在某些情况下使用的不正确的启发式,以基于存在的外键约束来估计联接选择性 (David Rowley)

    在存在多列外键约束但并不完全匹配查询的连接结构的情况下, 规划器使用了一种估计启发式方法, 结果表明该方法根本无法正常工作。将这些情况恢复到9.6之前的估计方式。

  • 修复了INSERTUPDATE 分配给数组域类型的列多个元素的情况 (Tom Lane)

  • 允许窗口函数在聚合函数参数内的子SELECT中使用 (Tom Lane)

  • 确保在基础表是外部表时,视图的CHECK OPTIONS子句被正确执行 (Etsuro Fujita)

    以前,更新可能会被完全推送到外部服务器,但如果有需要验证视图条件的需求会被忽略。

  • ALTER ... RENAME中移动自动生成的数组类型 (Vik Fearing)

    以前,我们会在CREATE过程中重新命名冲突的自动生成数组类型。 此修复将该行为扩展到重命名操作。

  • 当属于ALTER TABLE表的约束上有注释时,修复该表中的悬挂指针 (David Rowley)

    将注释重新应用到重构的约束可能会失败,出现奇怪的错误消息,甚至崩溃。

  • 确保ALTER USER ... SETALTER ROLE ... SET一样接受所有的语法变体 (Peter Eisentraut)

  • 允许外部表的CHECK约束最初是NOT VALID (Amit Langote)

    CREATE TABLE默默地为CHECK约束删除 NOT VALID说明符,因为表必须为空才可以立即验证约束。 但对于CREATE FOREIGN TABLE来说,这是错误的, 因为没有理由假设底层表是空的,并且决定约束可以被视为有效继续下一步也不是我们的职责。 为外部表跳过这个优化

  • 在将数据类型I/O函数的参数或返回类型从opaque 更改为正确类型时正确更新依赖项信息 (Heikki Linnakangas)

    CREATE TYPE更新在这种废弃很久的风格中声明的I/O函数时, 忘记记录对该类型的依赖关系,允许后续的DROP TYPE 留下破损的函数定义。

  • 从查询结果复制COPY时, 允许查询计划中的并行性 (Andres Freund)

  • ANALYZE处理tsvector列时, 减少内存使用量 (Heikki Linnakangas)

  • 将整数或浮点数乘以或除以money值时, 修正不必要的精确度损失和粗糙舍入 (Tom Lane)

  • 加紧检查解析标识符的函数中的空格,例如regprocedurein() (Tom Lane)

    根据流行的语言环境,这些函数可能会将多字节字符的片段误解为空白。

  • 在编译PL/Perl时使用Perl中的相关 #define符号 (Ashutosh Sharma, Tom Lane)

    这样可以避免可移植性问题,在使用最新的Perl版本时, 通常会在库加载期间显示为握手不匹配。

  • libpq中,在连接尝试失败后正确重置 GSS/SASL和SSPI身份验证状态 (Michael Paquier)

    如果不这样做,则意味着当从SSL退回到非SSL连接时, SSL尝试中的GSS/SASL失败将始终导致非SSL尝试失败。SSPI没有失败,但它泄漏了内存。

  • psql中,当COPY FROM STDIN 以键盘EOF信号结束,然后尝试另一个COPY FROM STDIN时修复失败 (Thomas Munro)

    在BSD派生的平台(包括macOS)上观察到这种不当行为,但在大多数其他平台上没有。

  • 修复pg_dumppg_restore 最后发出REFRESH MATERIALIZED VIEW命令 (Tom Lane)

    这可以防止在物化视图引用其他用户拥有的表时转储/恢复期间的错误。

  • 改善pg_dump/pg_restore 对起源于zlib的错误条件的报告 (Vladimir Kunschikov, Álvaro Herrera)

  • 修复pg_dump使用--clean 以按预期方式删除事件触发器 (Tom Lane)

    它现在也正确地分配事件触发器的所有权;之前, 它们被还原为由运行还原脚本的超级用户拥有。

  • public模式不存在时, 修复带有--clean选项的pg_dump 不要失败 (Stephen Frost)

  • 修复pg_dump以避免为空操作符类发出无效SQL (Daniel Gustafsson)

  • 修复pg_dump在Windows上输出到stdout (Kuntal Ghosh)

    写入标准输出的压缩纯文本转储将包含由于无法将文件描述符置于二进制模式而导致的损坏数据。

  • 修复pg_get_ruledef()为重命名了列的视图的 ON SELECT规则打印正确的输出 (Tom Lane)

    在某些极端情况下,pg_dump依赖于 pg_get_ruledef()转储视图,所以该错误会导致转储/重载失败。

  • 修复具有空约束的外连接的转储, 例如没有公共列的NATURAL LEFT JOIN的结果 (Tom Lane)

  • 修复FROM子句中函数表达式不会解析为看起来像函数调用的东西情况时, 函数表达式转储的情况 (Tom Lane)

  • 修复pg_basebackup在Windows上输出到stdout (Haribabu Kommi)

    写入stdout的备份将包含由于无法将文件描述符置于二进制模式而导致的损坏数据。

  • 修复pg_rewind以正确处理超过2GB的文件 (Kuntal Ghosh, Michael Paquier)

    通常这些文件不会出现在PostgreSQL数据目录中, 但在某些情况下它们可能存在。

  • 修复pg_upgrade确保结束WAL记录没有 wal_level = minimum (Bruce Momjian)

    这种情况可能会阻止升级后的备用服务器重新连接。

  • 修复pg_xlogdump对WAL记录长度的计算 (Andres Freund)

  • postgres_fdw中,在ALTER SERVERALTER USER MAPPING命令后重新建立与远程服务器的连接 (Kyotaro Horiguchi)

    这可以确保影响连接参数的选项更改会立即应用。

  • postgres_fdw中,允许取消远程事务控制命令 (Robert Haas, Rafia Sabih)

    这种变化使我们能够在很多情况下比以前更快地避免等待无响应的远程服务器。

  • 增加MAX_SYSCACHE_CALLBACKS以为扩展提供更多空间 (Tom Lane)

  • 在使用gcc构建共享库时,总是使用-fPIC而不是-fpic (Tom Lane)

    这在有所区分的平台上支持更大的扩展库。

  • 在MSVC构建中,处理openssl库不在 VC子目录中的情况 (Andrew Dunstan)

  • 在MSVC构建中,为libxml2头文件添加适当的包含路径 (Andrew Dunstan)

    这修复了以前需要在libxml2的标准Windows安装中移动东西的问题。

  • 在MSVC构建中,识别一个名为tcl86.lib的Tcl库 (Noah Misch)

  • 在MSVC构建中,在vcregress.pl 的命令行上遵守 PROVE_FLAGS设置 (Andrew Dunstan)