E.60. 版本 9.2.22

E.60.1. 迁移到版本 9.2.22
E.60.2. 修改列表

发布日期: 2017-08-10

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

PostgreSQL社区将于2017年9月停止发布9.2.X版本系列的更新。 鼓励用户尽快更新到更新的发行版分支。

E.60.1. 迁移到版本 9.2.22

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

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

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

E.60.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)

  • 在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进程中修复SIGHUPSIGUSR1处理 (Petr Jelinek, Andres Freund)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 修复Microsoft MSVC的构建脚本中的未转义大括号问题,以避免最近的Perl版本发出警告或错误 (Andrew Dunstan)

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

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

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

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