pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
2015-02-05
本次发布包含对 9.0.18 的多方面修复。有关 9.0 大版本中新特性的信息,请参见 第 E.49 节。.
修复to_char()中的缓冲区越界(Bruce Momjian)
当to_char()处理要求数字位数很多的数字格式模板时,PostgreSQL会读取越过缓冲区末尾。当处理恶意构造的时间戳格式模板时,PostgreSQL会写入越过缓冲区末尾。两种情况都可能导致服务器崩溃。我们尚未排除导致权限提升攻击的可能性,尽管这种攻击似乎不太可能。(CVE-2015-0241)
修复替换实现的*printf()函数中的缓冲区越界(Tom Lane)
PostgreSQL包含printf及相关函数的替换实现。当代码格式化浮点数(转换说明符e、E、f、F、g或G)且请求的精度超过约 500 时,会发生栈缓冲区越界。这会导致服务器崩溃,我们尚未排除导致权限提升攻击的可能性。数据库用户可以通过to_char()SQL 函数触发这种缓冲区越界。虽然这是唯一受影响的核心PostgreSQL功能,但使用 printf 族函数的扩展模块也可能存在风险。
此问题主要影响 Windows 上的PostgreSQL。PostgreSQL在系统实现足够完善时会使用系统实现,而其他现代平台上正是如此。(CVE-2015-0242)
修复contrib/pgcrypto中的缓冲区越界(Marko Tiikkaja、Noah Misch)
pgcrypto模块中内存大小跟踪的错误导致了栈缓冲区越界和对未初始化内存内容的不当依赖。缓冲区越界情况可能导致服务器崩溃,我们尚未排除导致权限提升攻击的可能性。(CVE-2015-0243)
修复出错后前端/后端协议可能失去同步的问题(Heikki Linnakangas)
如果服务器在从客户端读取协议消息中途发生任何错误,它可能失去同步,错误地把消息数据的一部分解释为新的协议消息。能够在命令参数中提交恶意构造二进制数据的攻击者可能借此注入自己的 SQL 命令。语句超时和查询取消是触发此场景最可能的错误来源。尤其容易受影响的是既使用超时又将任意用户构造数据作为二进制查询参数提交的应用程序。禁用语句超时会降低但不能消除被利用的风险。感谢 Emil Lenngren 报告此问题。(CVE-2015-0244)
修复通过约束违反错误消息的信息泄露(Stephen Frost)
某些服务器错误消息会显示违反约束(如唯一约束)的列的值。如果用户对该表的所有列没有SELECT权限,这可能意味着暴露用户不应看到的值。我们调整了代码,使值仅在来自 SQL 命令本身或用户可以查询到时才显示。(CVE-2014-8161)
锁定 Windows 上回归测试的临时安装(Noah Misch)
使用 SSPI 认证,只允许启动测试套件的操作系统用户连接。这在 Windows 上关闭了此前已在其他平台上关闭的同一漏洞,即其他用户可能连接到测试 postmaster。(CVE-2014-0067)
避免在使用 ALTER DATABASE SET TABLESPACE 把数据库移到新表空间、随后不久又移回原表空间时可能出现的数据损坏(Tom Lane)
避免当事务内的 ANALYZE 被回滚时损坏表(Andres Freund、Tom Lane、Michael Paquier)
如果失败的事务此前删除了表上的最后一个索引、规则或触发器,该表会处于损坏状态:相关的 pg_class 标志本应设置却未被设置。
修复 EvalPlanQual 处理中使用已释放内存的问题(Tom Lane)
在READ COMMITTED模式下,锁定或更新最近更新过的行的查询可能因此缺陷崩溃。
修复在子表上使用部分索引时 SELECT FOR UPDATE 的规划问题(Kyotaro Horiguchi)
在 READ COMMITTED 模式下,SELECT FOR UPDATE 在重新检查最近更新的行以确认它是否仍满足查询的 WHERE 条件时,还必须重新检查部分索引的 WHERE 条件。如果索引属于继承子表,就会遗漏这一要求,因此有可能错误地返回已不再满足查询条件的行。
修复 SELECT FOR UPDATE 在极端情况下可能把同一行返回两次、并且可能漏掉其他行的 corner case(Tom Lane)
在 READ COMMITTED 模式下,扫描继承树的 SELECT FOR UPDATE 可能错误地返回来自前一个子表的行,而不是本应从后一个子表返回的行。
拒绝 FOREIGN KEY 声明的被引用列列表中出现重复的列名(David Rowley)
这一限制符合 SQL 标准。此前我们并未显式拒绝这种情况,但之后代码会以看起来很怪异的错误失败。
修复 numeric 值求大整数次幂时的缺陷(Tom Lane)
之前的代码可能得到错误答案,或者在意识到结果必然溢出之前消耗过多的时间和内存。
在 numeric_recv() 中,按照值的 dscale 字段截去会被隐藏的小数位(Tom Lane)
numeric 值的显示标度(dscale)绝不应小于非零小数位的位数;但显然至少存在一个有缺陷的客户端应用,它发送的二进制 numeric 值违反了这一点。这会导致奇怪的行为,因为多余的数字位虽然不会被打印出来,却会被算术运算考虑在内。风险最小的修复方法似乎是在接收时把这类“隐藏的”数字位截去,使值确实与它打印出来的一致。
拒绝超出范围的数字时区规范(Tom Lane)
超过 +/- 168 小时(一周)的简单数字时区规范此前会被接受,但随后可能在某些操作中导致空指针解引用崩溃。如此大的 UTC 偏移没有实际使用场景,因此予以拒绝。
修复 tsquery @> tsquery 操作符中的缺陷(Heikki Linnakangas)
两个不同的词如果 CRC 相同,就会被认为匹配。此外,如果第二个操作数的词条比第一个多,就会被假定不包含于第一个;这是错误的,因为它可能包含重复词条。
增强 ispell 词典对有问题的词缀文件的防御(Tom Lane)
允许词典(thesaurus)包含超过 64K 个短语(David Boutin)
之前的代码在词典过大时会崩溃,因此这被视为一个可回移植的缺陷修复,而不是新特性。
修复xpath()中的命名空间处理(Ali Akbar)
此前,如果命名空间声明附在输入xml值的祖先元素上而非被返回的特定元素上,xpath()调用产生的xml值就不会包含命名空间声明。我们将祖先声明传播下来,使结果在孤立考虑时也是正确的。
修复嵌套 append 关系(例如 UNION ALL 子查询中的继承表)的规划器问题(Tom Lane)
当 GiST 索引元组放不进一个页面时干净地报错,而不是陷入无限递归(Andrew Gierth)
把设有逐表 cost_limit 和/或 cost_delay 设置的表排除在自动清理的全局代价平衡规则之外(Álvaro Herrera)
先前的行为实质上忽略了这些逐表设置,这并非本意。现在,拥有这类设置的表将按照这些设置进行清理,独立于其他自动清理工作进程的状况。这可能导致比以前更重的总 I/O 负载,因此应当重新审视这类设置是否合理。
避免在自动清理名义上被关闭时仍然进行全面的自动清理(Tom Lane)
即使自动清理名义上被关闭,我们仍会启动自动清理工作进程,去清理有 XID 回卷风险的表。然而,这样的工作进程随后会继续清理目标数据库中所有满足常规自动清理阈值的表。这往好里说是相当出乎意料,往坏里说会延误对回卷威胁的响应。现已修复:如果自动清理被关闭,工作进程只执行防回卷清理,不做任何其他工作。
修复热备查询与重放整页镜像之间的竞态条件(Heikki Linnakangas)
这一失误可能导致热备中正在执行的查询出现瞬时错误。
修复若干恢复逻辑不当忽略 COMMIT/ABORT PREPARED WAL 记录的情况(Heikki Linnakangas)
最值得注意的疏漏是 recovery_target_xid 无法用于在两阶段提交处停止。
避免为时间线历史文件创建不必要的 .ready 标记文件(Fujii Masao)
修复当使用空的预备语句且 log_statement 设置为 mod 或 ddl 时可能出现的空指针解引用(Fujii Masao)
将 “pgstat wait timeout” 警告消息改为 LOG 级别,并重新措辞使其更易理解(Tom Lane)
这条消息最初被认为基本属于不可能发生的情况,但它在我们较慢的 buildfarm 成员上出现得足够频繁,成了干扰。现已将其降为 LOG 级别,并在措辞上多下了一点功夫:现在它的内容为 “using stale statistics instead of current ones because stats collector is not responding”。
修复 SPARC 自旋锁实现,确保当 CPU 以非 TSO 一致性模式运行时(如某些非 Solaris 内核所做的那样)其正确性(Andres Freund)
警告 OS X 的 setlocale() 在 postmaster 内启动多余线程的情况(Noah Misch)
修复 PQconnectdbParams() 中重复 dbname 参数的处理(Alex Shulgin)
如果第一个 dbname 出现处包含要展开的连接串或 URI,就会出现意外行为。
确保 libpq 在遇到意外的套接字 EOF 时报告合适的错误消息(Marko Tiikkaja、Tom Lane)
取决于内核行为,当服务器意外关闭套接字时,libpq 可能返回空的错误字符串而不是有用的信息。
在 PQreset() 期间清除任何旧的错误消息(Heikki Linnakangas)
如果反复调用 PQreset() 而连接始终无法重建,失败连接尝试的错误消息会在 PGconn 的错误字符串中不断累积。
正确处理 libpq 解析连接选项期间的内存不足情况(Alex Shulgin、Heikki Linnakangas)
修复 ecpg 版 ParseDateTime() 中的数组越界(Michael Paquier)
在 initdb 中,当指定的密码文件为空时给出更清晰的错误消息(Mats Erik Andersson)
修复 psql 的 \s 命令,使其与 libedit 良好配合,并新增分页器支持(Stepan Rutz、Tom Lane)
使用 libedit 而非 readline 时,\s 会以一种相当难读的编码格式打印命令历史,而且在较新的 libedit 版本上可能完全失败。现已改为由我们自己打印历史而不是让库来做。一个令人愉快的副作用是,在合适的时候会使用分页器。
此补丁还修复了一个在使用 libedit 保存命令历史时换行编码不一致的缺陷。旧版 psql 写出的多行历史条目在此补丁后可以干净地读取,但反过来未必可行,具体取决于所涉及的 libedit 版本。
改进 psql 特殊变量解析的一致性(Tom Lane)
允许 ECHO_HIDDEN 和 ON_ERROR_ROLLBACK 使用 on 和 off 的变体拼写(如 1/0)。对 COMP_KEYWORD_CASE、ECHO、ECHO_HIDDEN、HISTCONTROL、ON_ERROR_ROLLBACK 和 VERBOSITY 的无法识别的值发出警告。对所有这些变量的所有值进行不区分大小写的识别;此前大小写敏感与不敏感的行为混杂在一起。
修复 psql 扩展模式显示在使用 border = 3 且 linestyle = ascii 或 unicode 时的一致性问题(Stephen Frost)
修复并行恢复纯模式转储时可能出现的死锁(Robert Haas、Tom Lane)
修复 pg_dump --binary-upgrade 在零列组合类型上的核心转储(Rushabh Lathia)
修复 contrib/pageinspect 的 get_raw_page() 中的块号检查(Tom Lane)
错误的检查逻辑可能阻止访问非主关系分支中的某些页面。
修复 contrib/pgcrypto 的 pgp_sym_decrypt(),使其在消息长度比 2 的幂小 6 时不再失败(Marko Tiikkaja)
安全地处理 contrib/tablefunc 的 connectby() 中的意外查询结果,尤其是 NULL(Michael Paquier)
此前 connectby() 遇到 NULL 键值时会崩溃。现在它会打印该行但不再进一步递归。
避免 contrib/xml2 的 xslt_process() 中可能出现的崩溃(Mark Simonetti)
libxslt 似乎对资源释放顺序存在未记载的依赖;重新排列我们的调用以避免崩溃。
大量清理 Coverity 静态代码分析器的警告(Andres Freund、Tatsuo Ishii、Marko Kreen、Tom Lane、Michael Paquier)
这些变更大多只是表面性的,但在某些情况下修复了极端情况的缺陷,例如内存不足失败后崩溃而不是正确报告错误。据信它们都不构成安全问题。
在构建期间检测不兼容的 OpenLDAP 版本(Noah Misch)
对于 2.4.24 到 2.4.31(含)之间的 OpenLDAP 版本,PostgreSQL 后端进程可能在退出时崩溃。现在会根据编译时的 OpenLDAP 版本号在 configure 期间发出警告,并在 contrib/dblink 回归测试中测试该崩溃场景。
在非 MSVC 的 Windows 构建中,确保安装的 libpq.dll 带有执行权限(Noah Misch)
使 pg_regress 成功退出时删除其创建的任何临时安装(Tom Lane)
这使 make check-world 期间的磁盘空间用量大幅减少,因为该序列会创建大量临时安装。
支持随时间改变 UTC 偏移的时区缩写(Tom Lane)
此前,PostgreSQL 假定时区缩写(如 EST)关联的 UTC 偏移在任何特定区域设置的用法中永不改变。然而这一假设在现实世界中并不成立,因此引入了让区域缩写表示有时会变化的 UTC 偏移的能力。更新了时区缩写定义文件,在自 1970 年以来缩写的 UTC 偏移发生过变化的时区区域设置中使用此功能(依据 IANA 时区数据库)。在此类时区中,PostgreSQL 现在会根据给定日期为缩写关联正确的 UTC 偏移。
更新时区缩写列表(Tom Lane)
把 CST(中国标准时间)加入列表。移除 ADT 作为“阿拉伯夏令时”的引用——这个缩写自 2007 年起已不再使用;因此,声称它与“大西洋夏令时”冲突似乎没有特别的帮助。修正 CKT(库克群岛)、FJT 和 FJST(斐济)完全错误的 GMT 偏移;此前我们甚至把它们放到了日期变更线的错误一侧。
把时区数据文件更新为 tzdata 版本 2015a。
IANA 时区数据库为所有澳大利亚时区采用了 A/xSTA 形式的缩写,以反映他们认为的当地当前多数用法。这些名称与其他地方的用法不冲突(唯一例外是表示 Acre 夏令时的 ACST,该用法自 1994 年起已废弃)。因此,我们把这些名称采纳进“默认”时区缩写集。“澳大利亚”缩写集现在只包含 CST、EAST、EST、SAST、SAT 和 WST,这些被认为主要是历史用法。注意,在“默认”缩写集中,SAST 也已改为南非标准时间。xDT
此外,新增时区缩写 SRET(Asia/Srednekolymsk)和 XJT(Asia/Urumqi),并对西萨摩亚使用 WSST/WSDT。同时,智利、墨西哥、特克斯和凯科斯群岛(America/Grand_Turk)以及斐济的夏令时法规有变更。还为巴布亚新几内亚部分地区新增了时区 Pacific/Bougainville。另外还有大量针对历史(1970 年以前)时区数据的修正。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。