版本 9.1.15

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 E. 版本说明 | 下一页

# E.28. 版本 9.1.15

> 发布日期: 2015-02-05

这个版本包含各种自9.1.14以来的修复。关于9.1主版本的新特性信息， 请查看第 E.43 节。

## E.28.1. 迁移到版本 9.1.15

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

不过，如果你是从一个早于9.1.14的版本升级而来，请查看第 E.29 节。

## E.28.2. 修改列表

- 修复`to_char()`中的缓冲区溢出 (Bruce Momjian)

  当`to_char()`处理大量数字的数值格式模板调用时， PostgreSQL将读完缓冲区。当处理精致的时间戳格式模板时， PostgreSQL将写完缓冲区。任何一种情况都会使服务器崩溃。 我们还未排除攻击导致权限提升的可能性，尽管看起来是不可能的。 (CVE-2015-0241)

- 修复替代`*printf()`函数中的缓冲区溢出 (Tom Lane)

  PostgreSQL包括`printf`和相关函数的一个替代实现。 在用要求的精度（大于500）格式化浮点数（转换说明符`e`、 `E`、`f`、`F`、`g`或`G`）时， 这个代码会耗尽堆栈缓冲区。这会使服务器崩溃， 并且我们还未排除攻击导致权限提升的可能性。 数据库用户可以通过`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认证，仅允许来自加载了该测试套件的OS用户的连接。 这在Windows上关闭了以前在其他平台上关闭的隐患， 也就是其他用户也可以连接到测试主机。 (CVE-2014-0067)

- 避免使用`ALTER DATABASE SET TABLESPACE`移动一个数据库到一个新的表空间， 然后稍后将其移回它原来的表空间时，可能的数据损坏 (Tom Lane)

- 避免事务中的`ANALYZE`回滚时损坏表 (Andres Freund, Tom Lane, Michael Paquier)

  如果失败的事务早已从表中删除了最后的索引、规则或触发器， 那么该表将停留在一个损坏的状态，没有设置相关的`pg_class` 标记，尽管它们应该设置。

- 确保在`CREATE DATABASE`或`ALTER DATABASE SET TABLESPACE`期间正确的拷贝了非日志表 (Pavan Deolasee, Andres Freund)

- 修复`DROP`的依赖搜索，正确的处理在表前递归的访问表字段的情况 (Petr Jelinek, Tom Lane)

  只知道在一个扩展同时创建了一个数据类型和使用该数据类型的表时会出现这种情况。 错误的代码会拒绝`DROP EXTENSION`，除非声明了`CASCADE`， 而这不是必须的。

- 修复EvalPlanQual处理中使用早已释放的内存的问题 (Tom Lane)

  在`READ COMMITTED`模式下，由于这个错误， 锁定或更新最近更新的行的查询会崩溃。

- 修复在子表上使用部分索引时`SELECT FOR UPDATE`的规划 (Kyotaro Horiguchi)

  在`READ COMMITTED`模式下，`SELECT FOR UPDATE` 在重新检查一个最近更新的行，看其是否仍然满足查询的`WHERE` 条件时，也必须重新检查部分索引的`WHERE`条件。 如果该索引属于一个集成子表，则忽略了这个需求， 所以有可能不正确的返回不再满足查询条件的行。

- 修复`SELECT FOR UPDATE`可能返回同一个行两次， 漏掉返回其他行的极端情况 (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)

- 在同义词辞典中允许多于64K的短语 (David Boutin)

  以前的编码在超级大的字典上会崩溃，所以认为这是一个可后向修复的bug， 而不是一个未来的添加。

- 修复`xpath()`中的命名空间处理 (Ali Akbar)

  以前，`xpath()`调用获得的`xml`值没有命名空间声明， 如果该命名空间声明附属于输入`xml`值的原始元素， 而不是要返回的特定元素。当单独考虑时，传递原始的声明，这样结果就是正确的了。

- 修复嵌套的附加关系的规划器问题，比如`UNION ALL` 子查询中的继承的表 (Tom Lane)

- 当GiST索引元组不适合一个页面时未能清理，而不是进入无限递归 (Andrew Gierth)

- 免除拥有每表`cost_limit`和/或来自自动清理的全局成本平衡规则 `cost_delay`设置的表 (Álvaro Herrera)

  以前的行为基本上忽略了这些每表的设置，这不是故意的。现在， 一个拥有这样设置的表将使用这些设置清理，与其他自动清理进程无关。 这会比以前加重总I/O负载，所以应该再三检查这样的设置。

- 避免自动清理名义上关闭时，大批量的自动清理 (Tom Lane)

  即使是自动清理名义上关闭时，我们仍然加载自动清理进程清理有XID概括风险的表。 不过，这样的工作进程会继续清理目标数据库中的所有表，如果它们符合自动清理的通常阈值。 这在最好情况下是个意外；在最坏情况下它延迟了概括威胁的响应。修复它， 这样如果关闭了自动清理，进程只执行反概括清理。

- 在崩溃恢复期间，确保非日志关系写做空并且在恢复完成之前同步到磁盘 (Abhijit Menon-Sen, Andres Freund)

  这阻止了非日志关系可能由于数据库崩溃恢复包含垃圾数据的情况。

- 修复热备查询和重放全页图片之间的竞态条件 (Heikki Linnakangas)

  这个错误会导致在热备中执行查询时的瞬态错误。

- 修复恢复逻辑不适当的忽略了`COMMIT/ABORT PREPARED` 的WAL记录的几个情况 (Heikki Linnakangas)

  最值得注意的疏忽是`recovery_min_apply_delay` 未能延迟两阶段提交的应用。

- 避免为时间线历史文件创建不必要的`.ready`标记文件 (Fujii Masao)

- 修复使用了空预备语句并且`log_statement`设置是`mod` 或`ddl`时，可能的空指针解引用 (Fujii Masao)

- 修改"pgstat wait timeout"警告消息为LOG级别， 并修改它使其更容易理解 (Tom Lane)

  原先以为该消息是基本上不会发生的情况，但是它在我们较慢的成员上经常发生， 令人讨厌。将其降为LOG级别，并且在措辞上多花了一些精力： 它现在读为"using stale statistics instead of current ones because stats collector is not responding"。

- 修复SPARC自旋锁实现，确保CPU运行在非TSO相干模式时的正确性， 就像一些非Solaris内核那样 (Andres Freund)

- 如果OS X的`setlocale()`在主服务器内部启动了一个不想要的额外线程， 则发出警告 (Noah Misch)

- 修复`PQconnectdbParams()`中重复的`dbname` 参数的处理 (Alex Shulgin)

  如果出现的第一个`dbname`包含要扩展的连接字符串或URI， 则意外的行为会跟着发生。

- 在意外的套接字EOF时，确保libpq报告合适的错误消息 (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)

- 改善数据库在相同的两个对象间包含多依赖路径的多个实例时， pg_dump的性能 (Tom Lane)

- 修复并发恢复仅模式的转储期间可能的死锁 (Robert Haas, Tom Lane)

- 修复零字段复合类型上`pg_dump --binary-upgrade`中的内核转储 (Rushabh Lathia)

- 阻止提升备用服务器时，`pg_basebackup -x/-X` 创建的WAL文件被再次归档 (Andres Freund)

- 修复`contrib/citext`从未打包的脚本中升级 (Tom Lane)

- 修复`contrib/pageinspect`的`get_raw_page()` 中的块编号检查 (Tom Lane)

  不正确的检查逻辑会阻止访问非主要关系分支中的一些页面。

- 修复`contrib/pgcrypto`的`pgp_sym_decrypt()`， 在消息长度为6，小于2的幂时不会失败 (Marko Tiikkaja)

- 修复`contrib/pg_test_fsync`中的文件描述符泄露 (Jeff Janes)

  这会导致未能删除Windows上的临时文件。

- 安全的处理`contrib/tablefunc`的`connectby()` 中意外的查询结果，尤其是NULL (Michael Paquier)

  以前如果`connectby()`遇到NULL键值是会崩溃的。 现在它打印该行但是不深入递归。

- 避免`contrib/xml2`的`xslt_process()` 中可能的崩溃 (Mark Simonetti)

  libxslt看起来对资源释放的顺序有一个未记录的依赖； 重新排序我们的调用以避免崩溃。

- 让一些`contrib` I/O函数有正确的易变属性 (Tom Lane)

  以前过于保守的标记在正常使用中是不重要的，但是会导致优化问题， 或者拒绝有效的索引表达式定义。因为后果不严重， 我们只是在该扩展模块的脚本中调整了该函数的定义，而没有改变版本号。

- 清理了许多来自Coverity静态代码分析器的警告 (Andres Freund, Tatsuo Ishii, Marko Kreen, Tom Lane, Michael Paquier)

  这些修改主要是美化用的，但是修复了一些情况下的极端情况错误， 比如，内存溢出故障之后的崩溃而不是一个适当的错误报告。 没有一个人认为这代表安全问题。

- 在建立时检测不兼容的OpenLDAP版本 (Noah Misch)

  有OpenLDAP版本2.4.24到2.4.31（首尾包含），PostgreSQL 后端在退出时崩溃。在基于编译时OpenLDAP版本号configure 期间，提出一个警告，并在`contrib/dblink`的回归测试中测试崩溃情况。

- 在非MSVC Windows建立中，确保`libpq.dll`是带有执行权限安装的 (Noah Misch)

- 让pg_regress在成功退出时删除任何它创建的临时安装 (Tom Lane)

  结果是在`make check-world`期间磁盘空间的使用大量的减少， 因为该序列包含好几个临时安装的创建。

- 支持时区缩写不时的修改UTC偏移 (Tom Lane)

  以前，PostgreSQL假设UTC偏移与时区缩写关联（比如`EST`）， 在特定区域的使用中是永远不变的。不过这个假设在现实世界中是失败的， 所以引入了时区缩写代表不时变化的UTC偏移的能力。 更新时区缩写定义文件，在1970年以来已经改变了UTC偏移的时区缩写环境中使用该特性 （根据IANA时区数据库）。在这样的时区中，PostgreSQL 现在将根据给定的日期关联正确的UTC偏移到缩写。

- 更新时区缩写列表 (Tom Lane)

  添加CST (China Standard Time)到我们的列表。删除ADT到"Arabia Daylight Time" 的引用，它在2007年就废弃了；因此，声明与"Atlantic Daylight Time" 冲突看起来没什么帮助。为CKT (Cook Islands)、FJT和FJST (Fiji) 修复完全不正确的GMT偏移；我们甚至没有它们适当的日期变更线。

- 更新时区数据文件到tzdata版本2015a。

  IANA时区数据库为所有澳大利亚时区采取了 `A`x`ST`/`A`x`DT` 格式的缩写，反映了他们认为现在澳大利亚的多数实现。 这些名字与其他地方的使用并不冲突（除了ACST表示Acre Summer Time， 它在1994年就已经停用了）。因此，接受这些名字到我们的"Default" 时区缩写集。"Australia"缩写集现在仅包含CST、EAST、EST、SAST、SAT和WST， 认为所有这些大都是历史用法。请注意，SAST在"Default" 缩写集中也已经被修改为South Africa Standard Time。

  另外，添加时区缩写SRET (Asia/Srednekolymsk)和XJT(Asia/Urumqi)， 并为西萨摩亚使用WSST/WSDT。还有，DST规律在智利、墨西哥、土耳其 & 凯科斯群岛和斐济发生了改变。Papua New Guinea的一部分有一个新的时区 Pacific/Bougainville。还更正了一些历史（1970以前）的时区数据。

上一页 | 起始页 | 下一页
版本 9.1.16 | 上一级 | 版本 9.1.14