pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
发布日期:. 2017-08-10
本发行版包含对 9.4.12 的多项修复。有关 9.4 主版本中新功能的信息,请参见第 E.27 节。
对于运行 9.4.X 的用户,不需要转储/恢复。
但是,如果你使用的外部数据服务器依赖用户密码进行认证,请参见下面的第一条变更日志条目。
另外,如果你是从早于 9.4.12 的版本升级,请参见第 E.15 节。
进一步限制 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)
让 lo_put() 检查对目标大对象的 UPDATE 权限(Tom Lane、Michael Paquier)
lo_put() 理所当然应要求与 lowrite() 相同的权限,但检查缺失,允许任何 用户更改大对象中的数据。(CVE-2017-7548)
修复元组更新链的并发锁定(Álvaro Herrera)
如果多个会话用非冲突锁模式并使用旧快照并发锁定一条元组更新链,且都 成功,由于竞态条件其中一些仍可能失败(并得出没有存活元组版本的 结论)。这会导致诸如外键检查看不到一个确实存在但正被并发更新的 元组之类的后果。
修复冻结 XMAX 为恰好剩一个仍受关注成员的多事务的元组时潜在的数据损坏(Teodor Sigaev)
避免在内存中排序超过十亿个元组时的整数溢出及随后的崩溃(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_SWITCHWAL 记录后被提升时可能创建无效 WAL 段的问题(Andres Freund)
修复walsender在客户端请求关闭时及时退出的问题(Tom Lane)
修复 walsender 进程中SIGHUP和SIGUSR1的处理(Petr Jelinek、Andres Freund)
防止关闭检查点期间由 walsender 触发的 panic(Andres Freund、Michael Paquier)
修复因 postmaster 中的竞争条件导致walreceiver进程不必要地缓慢重启的问题(Tom Lane)
修复极宽元组导致逻辑解码失败的问题(Andres Freund)
逻辑解码在宽于 64KB 的元组(压缩后但仍全部内联存储)上会崩溃。该情况仅在包含此类元组的表上启用了REPLICA IDENTITY FULL时才会出现。
修复逻辑解码期间溢出到磁盘的小子事务的泄漏(Andres Freund)
这导致临时文件消耗过多的磁盘空间。
减少创建逻辑解码槽期间构建快照所需的工作(Andres Freund、 Petr Jelinek)
原来的算法在有大量打开事务的服务器上昂贵得不可行。
修复可能无限延迟逻辑解码槽创建的竞争条件(Andres Freund、Petr Jelinek)
减少处理系统缓存失效事件的开销(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/pg_restore对源自zlib的错误情况的报告(Vladimir Kunschikov, Álvaro Herrera)
修复 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)
这一更改使我们能在比以前多得多的情况下快速摆脱对无响应远程服务器的 等待。
提高MAX_SYSCACHE_CALLBACKS以为扩展提供更多空间(Tom Lane)
用 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)
MSVC 构建中,遵循vcregress.pl命令行上的PROVE_FLAGS设置(Andrew Dunstan)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。