发布日期:. 2015-02-05
这个版本包含各种自9.3.5以来的修复。关于9.3主版本的新特性信息, 请查看第 E.57 节。
运行9.3.X的用户不需要转储/恢复。
不过,如果你是Windows用户,并且正在使用“Norwegian (Bokmål)”环境, 在升级用纯ASCII别名“Norwegian_Norway”替代存储在PostgreSQL 系统目录中的任意“Norwegian (Bokmål)_Norway”环境名之后需要手动。 详情请看http://wiki.postgresql.org/wiki/Changes_To_Norwegian_Locale
另外,如果你是从一个早于9.3.5的版本升级而来,那么请查看第 E.52 节。
修复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)
处理名为“Norwegian (Bokmål)”的Windows环境 (Heikki Linnakangas)
非ASCII环境名是有问题的,因为它不清楚应该以什么编码表示。 映射有问题的环境名到纯ASCII别名,“Norwegian_Norway”。
避免使用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)
修复CreateEventTrigStmt
.eventname
的不正确的处理
(Petr Jelinek)
如果CREATE EVENT TRIGGER
作为预处理查询执行,
或者通过扩展的查询控制,则这会导致错误行为。
修复DROP
的依赖搜索,正确的处理在表前递归的访问表字段的情况
(Petr Jelinek, Tom Lane)
只知道在一个扩展同时创建了一个数据类型和使用该数据类型的表时会出现这种情况。
错误的代码会拒绝DROP EXTENSION
,除非声明了CASCADE
,
而这不是必须的。
修复EvalPlanQual处理中使用早已释放的内存的问题 (Tom Lane)
在READ COMMITTED
模式下,由于这个错误,
锁定或更新最近更新的行的查询会崩溃。
避免在EvalPlanQual处理中尝试请求元组锁时可能的死锁 (Álvaro Herrera, Mark Kirkwood)
修复多个其他事务并发的持有FOR SHARE
锁时,
一个事务尝试请求FOR NO KEY EXCLUSIVE
元组锁时的未能等待
(Álvaro Herrera)
修复在子表上使用部分索引时SELECT FOR UPDATE
的规划 (Kyotaro Horiguchi)
在READ COMMITTED
模式下,SELECT FOR UPDATE
在重新检查一个最近更新的行,看其是否仍然满足查询的WHERE
条件时,也必须重新检查部分索引的WHERE
条件。
如果该索引属于一个集成子表,则忽略了这个需求,
所以有可能不正确的返回不再满足查询条件的行。
修复SELECT FOR UPDATE
可能返回同一个行两次,
漏掉返回其他行的极端情况 (Tom Lane)
在READ COMMITTED
模式下,SELECT FOR UPDATE
扫描一个继承树,会错误的返回一个来自之前子表的行,
而不是它应该返回的来自后来的子表的行。
改善EXPLAIN
大的范围表的性能 (Tom Lane)
在FOREIGN KEY
声明的参考字段列表中拒绝重复的字段名 (David Rowley)
这个限制是SQL标准的。以前我们并不明确拒绝这种情况, 但是后来代码会由于奇怪的锁定错误而失败。
重新启用SELECT ... OFFSET -1
的错误 (Tom Lane)
自8.4开始,负的偏差值是错误的,但是在9.3中添加了一个优化, 意外的使这种情况变成了空操作。恢复预期的行为。
恢复域转换的以前的行为到JSON (Tom Lane)
这个修改导致数值和布尔域为了转换到JSON的目的,被看做它们的基本类型。 它就像9.3.5和9.2.9之前那样工作,但是是在修复一个相关问题时无意修改的。
修复json_agg()
,在它的结果中不要返回多余的右方括号 (Tom Lane)
修复提升numeric
值到一个大的整数幂中的错误 (Tom Lane)
以前的代码得到一个错误的结果,或者在意识到结果会溢出之前消耗大量的时间和内存。
在numeric_recv()
中,截断任何将要根据值的dscale
字段隐藏的小数位 (Tom Lane)
numeric
值的显示精度(dscale
)永远都不应该小于非零小数位的数量;
但是很显然,至少有一个客户端应用这样传输二进制numeric
值。
这导致奇怪的行为,因为额外的数位也会计入数学运算,即使它们没有显示出来。
最小风险的修复看起来是在接收时就截断这样的“隐藏”位,
这样数值就确实是它打印出来的样子了。
修复最短优先正则表达式匹配的不正确搜索 (Tom Lane)
当允许的迭代次数被?
修饰符或范围表达式限制时,匹配通常会失败。
拒绝超出范围的数字时区声明 (Tom Lane)
接受超过+/- 168小时(一周)的简单数字时区声明, 但是会导致某些操作空指针解引用崩溃。没有这样大的UTC偏移用例, 所以拒绝它们。
修复tsquery
@>
tsquery
运算符中的错误
(Heikki Linnakangas)
如果两个不同的条目有相同的CRC,则认为它们匹配。另外, 如果第二个操作数的项比第一个操作数多,将假设它不包含在第一个中; 这是错误的,因为它可能包含重复的项。
改善ispell字典对坏的词缀文件的防御 (Tom Lane)
在同义词辞典中允许多于64K的短语 (David Boutin)
以前的编码在超级大的字典上会崩溃,所以认为这是一个可后向修复的bug, 而不是一个未来的添加。
修复xpath()
中的命名空间处理 (Ali Akbar)
以前,xpath()
调用获得的xml
值没有命名空间声明,
如果该命名空间声明附属于输入xml
值的原始元素,
而不是要返回的特定元素。当单独考虑时,传递原始的声明,这样结果就是正确的了。
确保整行变量暴露非空字段名给关注复合类型中字段名的函数 (Tom Lane)
在一些环境中,像row_to_json(tab.*)
这样的构造可能不会产生预期的字段名。
这在9.4中很好的修复了;在较老的分支中,仅确保我们产生一些非空名。
(在一些情况下,是底层表的字段名,而不是理论上应该可见的查询赋予的别名。)
修复系统字段的错误处理,尤其是tableoid
,在FDW查询中 (Etsuro Fujita)
修复范围操作符选择性估计中的各种疏忽 (Emre Hasegeli)
这个补丁修复了极端情况“unexpected operator NNNN”规划器错误, 并且改善了一些其他情况的选择性估计。
避免将
作为索引修饰符,
如果它会导致一个较差的规划 (Andrew Gierth)indexed_column
= ANY
(array
)
在某些情况下,= ANY
条件应用到非第一索引字段将会作为索引条件处理,
即使将它用作简单过滤器条件会更好。
修复接受一个复合参数的可内联SQL函数用在LATERAL
子查询中,
并且该复合参数是一个横向引用时,“variable not found in subplan target list”
的规划器失败 (Tom Lane)
修复嵌套的附加关系的规划器问题,比如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_target_xid
不能用来在两阶段提交停止。
阻止最新的WAL文件在崩溃恢复完成时被再次归档 (Fujii Masao)
避免为时间线历史文件创建不必要的.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”。
修复主服务器的动态后端进程列表可能的损坏 (Andres Freund)
修复SPARC自旋锁实现,确保CPU运行在非TSO相干模式时的正确性, 就像一些非Solaris内核那样 (Andres Freund)
如果macOS的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的\watch
命令像\pset null
说明的那样显示null (Fujii Masao)
修复psql的扩展模式显示,在使用border
= 3
和linestyle
= ascii
或unicode
时,一致的工作 (Stephen Frost)
修复pg_dump,不失败的处理事件触发器上的注释 (Tom Lane)
允许并行pg_dump使用--serializable-deferrable
(Kevin Grittner)
改善数据库在相同的两个对象间包含多依赖路径的多个实例时, pg_dump的性能 (Tom Lane)
修复pg_dumpall,恢复它从8.1之前的服务器转储的能力 (Gilles Darold)
修复并发恢复仅模式的转储期间可能的死锁 (Robert Haas, Tom Lane)
修复零字段复合类型上pg_dump --binary-upgrade
中的内核转储 (Rushabh Lathia)
修复pg_upgrade期间,未能同步非缺省表空间中的表 (Abhijit Menon-Sen, Andres Freund)
由于操作系统崩溃和一些坏运气,这会导致升级期间数据丢失。
在pg_upgrade中,处理新的集群为以前没有TOAST的表创建一个TOAST表的情况 (Bruce Momjian)
以前这会由于OID冲突而失败。
在pg_upgrade中,不要尝试为老的集群设置
autovacuum_multixact_freeze_max_age
(Bruce Momjian)
这会导致失败,因为并非所有9.3.X版本都有那个参数。幸运的是, 我们实际上并不需要设置它。
在pg_upgrade中,保存事务ID (Bruce Momjian)
这个疏忽没有适当的打扰PostgreSQL, 但是会混淆一些外部的复制工具。
阻止提升备用服务器时,pg_basebackup -x/-X
创建的WAL文件被再次归档 (Andres Freund)
修复pg_receivexlog中的内存泄露 (Fujii Masao)
修复非故意的压制pg_receivexlog冗长消息 (Fujii Masao)
修复contrib/auto_explain
的失败,
在执行EXPLAIN ANALYZE
时打印每节点的时间信息 (Tom Lane)
修复contrib/citext
从未打包的脚本中升级 (Tom Lane)
避免contrib/hstore
的hstore_to_json()
中整数溢出和缓冲区溢出 (Heikki Linnakangas)
修复hstore_to_json_loose()
中数字的识别,
以便正确的区分JSON数字和字符串 (Andrew Dunstan)
修复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)
这些修改主要是美化用的,但是修复了一些情况下的极端情况错误, 比如,内存溢出故障之后的崩溃而不是一个适当的错误报告。 没有一个人认为这代表安全问题。
修复EXEC_BACKEND建立中后端进程的设置,比如Windows (Robert Haas)
在建立时检测不兼容的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
STA
格式的缩写,反映了他们认为现在澳大利亚的多数实现。
这些名字与其他地方的使用并不冲突(除了ACST表示Acre Summer Time,
它在1994年就已经停用了)。因此,接受这些名字到我们的“Default”
时区缩写集。“Australia”缩写集现在仅包含CST、EAST、EST、SAST、SAT和WST,
认为所有这些大都是历史用法。请注意,SAST在“Default”
缩写集中也已经被修改为South Africa Standard Time。x
DT
另外,添加时区缩写SRET (Asia/Srednekolymsk)和XJT(Asia/Urumqi), 并为西萨摩亚使用WSST/WSDT。还有,DST规律在智利、墨西哥、土耳其 & 凯科斯群岛(America/Grand_Turk)和斐济发生了改变。Papua New Guinea的一部分有一个新的时区 Pacific/Bougainville。还更正了一些历史(1970以前)的时区数据。