E.8. 版本 9.3.18 #
发行日期:. 2017-08-10
本次发布包含对 9.3.17 的多方面修复。有关 9.3 大版本中新特性的信息,请参见第 E.26 节。.
E.8.1. 迁移到版本 9.3.18
对于运行 9.3.X 的用户,不需要进行转储/恢复。
但是,如果你使用的外部数据服务器依赖用户密码进行认证,请参见下面的第一条变更日志条目。
不过,如果你是从早于 9.3.16 的版本升级,请参见第 E.10 节。
E.8.2. 变更
进一步限制
pg_user_mappings.umoptions的可见性,以保护存储为用户映射选项的密码(Noah Misch)CVE-2017-7486 的修复不正确:它允许用户看到她自己用户映射中的选项,即使她对相关外部服务器没有
USAGE权限。这种选项可能包含由服务器所有者而非用户自己提供的密码。由于information_schema.user_mapping_options在这种情况下不显示选项,pg_user_mappings也不应该。(CVE-2017-7547)此补丁本身只会修复新 initdb 的数据库中的行为。如果希望在现有数据库中应用此更改,需要执行以下操作:
在
postgresql.conf中添加allow_system_table_mods = true后重启 postmaster。(在支持ALTER SYSTEM的版本中,可以用它进行配置更改,但仍需重启。)在集簇的每个数据库中,以超级用户身份运行以下命令:
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);不要忘记包括
template0和template1数据库,否则漏洞仍会存在于之后创建的数据库中。要修复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';
最后,移除
allow_system_table_mods配置设置,并再次重启 postmaster。
禁止在所有基于密码的认证方法中使用空密码(Heikki Linnakangas)
libpq 忽略空的密码说明,不把它们传输给服务器。因此,如果用户的密码被设为空字符串,就无法通过 psql 或其他基于 libpq 的客户端用该密码登录。管理员可能因此认为把密码设为空等同于禁用密码登录。然而,使用修改过的或非 libpq 的客户端,登录可能是可能的,这取决于配置的认证方法。特别是最常见的方法
md5接受空密码。更改服务器在所有情况下拒绝空密码。(CVE-2017-7546)修复元组更新链的并发锁定([Aacute]lvaro Herrera)
如果多个会话用非冲突锁模式并使用旧快照并发锁定一条元组更新链,且都成功,由于竞态条件其中一些仍可能失败(并得出没有存活元组版本的结论)。这会导致诸如外键检查看不到一个确实存在但正被并发更新的元组之类的后果。
修复冻结 XMAX 是恰好只有一个仍感兴趣成员的多事务的元组时可能的数据损坏(Teodor Sigaev)
在 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_SWITCHWAL 记录后被提升时可能创建无效 WAL 段的问题(Andres Freund)修复 walsender 进程中的 SIGHUP 和 SIGUSR1 处理(Petr Jelinek、Andres Freund)
修复 postmaster 中竞态条件导致的 walreceiver 进程不必要的缓慢重启(Tom Lane)
修复
INSERT或UPDATE对数组之上域类型的列的多个元素赋值的情况(Tom Lane)允许在聚合函数参数内的子
SELECT中使用窗口函数(Tom Lane)在
ALTER ... RENAME期间把自动生成的数组类型移开(Vik Fearing)此前我们在
CREATE期间会把冲突的自动生成数组类型重命名移开;此修复把该行为扩展到重命名操作。确保
ALTER USER ... SET接受ALTER 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 版本时。
在 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_dump 和 pg_restore 把
REFRESH MATERIALIZED VIEW命令放在最后发出(Tom Lane)这防止了物化视图引用其他用户拥有的表时转储/恢复期间的错误。
修复 pg_dump 使用
--clean选项按预期删除事件触发器(Tom Lane)它现在还正确分配事件触发器的所有权;此前它们被恢复为归运行恢复脚本的超级用户所有。
修复 pg_dump 不再为空操作符类发出无效 SQL(Daniel Gustafsson)
修复 pg_dump 在 Windows 上输出到 stdout(Kuntal Ghosh)
由于未把文件描述符置为二进制模式,写到 stdout 的压缩纯文本转储会包含损坏的数据。
修复
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_upgrade 确保结束 WAL 记录不具有wal_level =
minimum(Bruce Momjian)这一条件可能阻止升级后的备库服务器重新连接。
在
postgres_fdw中,ALTER SERVER或ALTER USER MAPPING命令之后重建到远程服务器的连接(Kyotaro Horiguchi)这确保影响连接参数的选项更改被及时应用。
在
postgres_fdw中,允许取消远程事务控制命令(Robert Haas、Rafia Sabih)这一更改使我们能在比以前多得多的情况下快速摆脱对无响应远程服务器的等待。
用 gcc 构建共享库时始终使用
-fPIC而不是-fpic(Tom Lane)这在有差别的平台上支持更大的扩展库。
修复我们的 Microsoft MSVC 构建脚本中花括号未转义的问题,以避免较新的 Perl 版本发出警告或报错(Andrew Dunstan)
在 MSVC 构建中,处理 openssl 库不在
VC子目录内的情况(Andrew Dunstan)在 MSVC 构建中,为 libxml2 头文件添加正确的包含路径(Andrew Dunstan)
这修复了以前需要移动标准 Windows 安装的 libxml2 中某些东西的需要。
在 MSVC 构建中,识别名为
tcl86.lib的 Tcl 库(Noah Misch)