E.129. 版本 8.3.18 #
发行日期:. 2012-02-27
本次发布包含对 8.3.17 的多方面修复。有关 8.3 大版本中新特性的信息,请参见第 E.147 节。.
E.129.2. 变更
让
CREATE TRIGGER要求对触发器函数有执行权限(Robert Haas)这一缺失的检查可能允许另一用户通过把触发器函数安装到自己拥有的表上,以伪造的输入数据执行该触发器函数。这只对标记为
SECURITY DEFINER的触发器函数有影响,因为其他情况下触发器函数本来就以表所有者身份运行。(CVE-2012-0866)把 pg_dump 注释中写入的名称里的换行符转换为空格(Robert Haas)
pg_dump 此前对其输出脚本中 SQL 注释内写出的对象名清理不慎。包含换行符的名称至少会使脚本语法错误。恶意构造的对象名可能在脚本重载时构成 SQL 注入风险。(CVE-2012-0868)
修复插入与清理并发导致 btree 索引损坏的问题(Tom Lane)
插入导致的索引页分裂有时会使并发运行的
VACUUM漏删本应删除的索引项。在相应的表行被删除后,悬空的索引项会导致错误(例如 “could not read block N in file ...”),或者更糟:当不相关的行被重新插入到现已空闲的表位置后,查询会静默地得到错误结果。该缺陷自 8.2 起就存在,但发生频率极低,直到现在才被诊断出来。如果你有理由怀疑它曾在你的数据库中发生,对受影响的索引重建索引即可修复。允许
ALTER USER/DATABASE SET中某些设置取不存在的值(Heikki Linnakangas)允许把
default_text_search_config、default_tablespace和temp_tablespaces设为未知的名称。这是因为设置要在其中使用的另一个数据库中它们可能是已知的;对表空间的情况,则是因为表空间可能尚未创建。此前search_path已被认识到有同样的问题,这些设置现在的行为与它一致。在 WAL 重放期间正确跟踪 OID 计数器,即使它发生回卷(Tom Lane)
此前 OID 计数器会一直停留在高值,直到系统退出重放模式。其实际后果通常为零,但在某些场景下,已提升为主库的备库服务器在需要 OID 值时,可能要很长时间才能把 OID 计数器推进到合理的值。
修复带
*的正则表达式反向引用(Tom Lane)代码实际上并不强制精确字符串匹配,而是接受任何满足反向引用符号所引用的模式子表达式的字符串。
类似问题仍困扰着嵌入在更大带量词表达式中(而非量词直接作用对象)的反向引用。这将在未来的 PostgreSQL 版本中解决。
修复最近引入的
inet/cidr值处理中的内存泄漏(Heikki Linnakangas)PostgreSQL 2011 年 12 月版本中的一个补丁导致这些操作中的内存泄漏,在此类列上构建 btree 索引等场景中可能相当显著。
避免 Windows 上 syslogger 中文件句柄的双重关闭(MauMau)
通常这个错误不可见,但在调试版 Windows 上运行时会导致异常。
修复 plpgsql 中与 I/O 转换相关的内存泄漏(Andres Freund、Jan Urbanski、Tom Lane)
某些操作会一直泄漏内存直到当前函数结束。
改进 pg_dump 对继承表列的处理(Tom Lane)
pg_dump 错误处理了子列与父列默认表达式不同的情况。如果默认值在文本上与父列相同但实际不同(例如因为模式搜索路径差异),它不会被识别为不同,因此转储和恢复后子列会被允许继承父列的默认值。子列为
NOT NULL而父列不是的情况也可能被微妙地错误恢复。修复 pg_restore 直接写数据库模式对 INSERT 式表数据的处理(Tom Lane)
当使用 2011 年 9 月或 12 月版本的 pg_restore 时,对以
--inserts或--column-inserts选项制作的归档文件直接恢复到数据库会失败,这是对另一个问题的修复中的一个疏忽所致。归档文件本身没有问题,文本模式输出也正常。修复
contrib/intarray的int[] & int[]操作符中的错误(Guillaume Lelarge)如果两个输入数组共有的最小整数是 1,且任一数组中有更小的值,那么 1 会被错误地从结果中遗漏。
修复
contrib/pgcrypto的encrypt_iv()和decrypt_iv()中的错误检测(Marko Kreen)这些函数未能报告某些类型的无效输入错误,而是对错误输入返回随机垃圾值。
修复
contrib/test_parser中的一字节缓冲区越界(Paul Guyot)代码会尝试多读一个字节,这在极端情况下会崩溃。由于
contrib/test_parser只是示例代码,这本身不是安全问题,但坏的示例代码仍然是坏的。在 ARM 上如果可用则使用
__sync_lock_test_and_set()实现自旋锁(Martin Pitt)该函数取代了我们此前对
SWPB指令的使用,该指令已被弃用且在 ARMv6 及更高版本上不可用。报告表明旧代码在较新的 ARM 板上不会以明显方式失败,而只是不对并发访问互锁,导致多进程操作中的离奇失败。在使用接受该选项的 gcc 版本构建时使用
-fexcess-precision=standard选项(Andrew Dunstan)这防止了较新版本 gcc 产生"创造性"结果的各种场景。
允许在 FreeBSD 上使用线程化 Python(Chris Rees)
我们的 configure 脚本此前认为这种组合无法工作;但 FreeBSD 修复了问题,因此移除该错误检查。