pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
发行日期:. 2012-02-27
本次发布包含对 9.1.2 的多方面修复。有关 9.1 大版本中新特性的信息,请参见 第 E.76 节。.
让 CREATE TRIGGER 要求对触发器函数有执行权限(Robert Haas)
这一缺失的检查可能允许另一用户通过把触发器函数安装到自己拥有的表上,以伪造的输入数据执行该触发器函数。这只对标记为 SECURITY DEFINER 的触发器函数有影响,因为其他情况下触发器函数本来就以表所有者身份运行。(CVE-2012-0866)
移除 SSL 证书中通用名长度的任意限制(Heikki Linnakangas)
libpq 和服务器此前都会把从 SSL 证书提取的通用名截断到 32 字节。通常这最坏只会造成意外的验证失败,但在一些相当难以置信的场景下,它可能允许一个证书持有者冒充另一个。受害者必须恰好有 32 字节长的通用名,而攻击者必须说服受信任的 CA 颁发一个通用名以该字符串为前缀的证书。冒充服务器还需要额外的攻击手段来重定向客户端连接。(CVE-2012-0867)
把 pg_dump 注释中写入的名称里的换行符转换为空格(Robert Haas)
pg_dump 此前对其输出脚本中 SQL 注释内写出的对象名清理不慎。包含换行符的名称至少会使脚本语法错误。恶意构造的对象名可能在脚本重载时构成 SQL 注入风险。(CVE-2012-0868)
修复插入与清理并发导致 btree 索引损坏的问题(Tom Lane)
插入导致的索引页分裂有时会使并发运行的 VACUUM 漏删本应删除的索引项。在相应的表行被删除后,悬空的索引项会导致错误(例如 “could not read block N in file ...”),或者更糟:当不相关的行被重新插入到现已空闲的表位置后,查询会静默地得到错误结果。该缺陷自 8.2 起就存在,但发生频率极低,直到现在才被诊断出来。如果你有理由怀疑它曾在你的数据库中发生,对受影响的索引重建索引即可修复。
修复 WAL 重放期间共享缓冲区的瞬时清零(Tom Lane)
重放逻辑有时会把一个共享缓冲区清零再重新填充,使其内容瞬时无效。在热备模式下,这可能导致并行执行的查询看到垃圾数据。这可能引发各种症状,但最常见的好像是 “invalid memory alloc request size”。
修复 READ COMMITTED 重新检查中对修改数据的 WITH 子计划的处理(Tom Lane)
在 READ COMMITTED 模式下,如果父 UPDATE 或 DELETE 命令因并发更新而需要在一行或多行上重新求值,包含 INSERT/UPDATE/DELETE 的 WITH 子句就会崩溃。
修复 SSI 事务清理中的一个极端情况(Dan Ports)
在结束一个读写可序列化事务时,如果其余所有活动的可序列化事务都是只读的,就可能发生崩溃。
修复 postmaster,使其在热备崩溃后尝试重启(Tom Lane)
一个逻辑错误导致:如果有后端进程在热备模式下运行时崩溃,postmaster 会终止而不是尝试重启集簇。
修复 CLUSTER/VACUUM FULL 对最近更新的行所拥有的 toast 值的处理(Tom Lane)
这一疏忽可能导致在这些命令之一执行期间,toast 表的索引报 “duplicate key value violates unique constraint” 错误。
更改表所有者时,不仅更新表级权限,也更新逐列权限(Tom Lane)
未做到这一点意味着,此前授予的所有列权限仍显示为由旧所有者授予。这导致新所有者和超级用户都无法撤销这些现在无法追溯到表所有者的权限。
在 REASSIGN OWNED 中支持外部数据包装器和外部服务器(Alvaro Herrera)
如果该命令需要更改任何这类对象的所有权,会报 “unexpected classid” 错误。
允许 ALTER USER/DATABASE SET 中某些设置取不存在的值(Heikki Linnakangas)
允许把 default_text_search_config、default_tablespace 和 temp_tablespaces 设为未知的名称。这是因为设置要在其中使用的另一个数据库中它们可能是已知的;对表空间的情况,则是因为表空间可能尚未创建。此前 search_path 已被认识到有同样的问题,这些设置现在的行为与它一致。
修复 INSERT 表达式中的 COLLATE 导致的 “unsupported node type” 错误(Tom Lane)
避免在提交后删除表文件出现问题时崩溃(Tom Lane)
删除表应只在事务提交后才删除底层磁盘文件。如果那时失败(例如因为文件权限错误),代码本应只发出警告消息并继续,因为此时中止事务已为时过晚。这一逻辑从 8.4 起被破坏,导致这类情况引发 PANIC 和无法重启的数据库。
从 DROP TABLESPACE 的 WAL 重放期间的错误中恢复(Tom Lane)
重放会尝试删除表空间的目录,但这可能因各种原因失败(例如这些目录的所有权或权限不正确)。此前重放代码会 panic,使数据库在没有人工干预的情况下无法重启。记录问题并继续似乎更好,因为删除目录失败唯一后果只是浪费一些磁盘空间。
修复为热备记录 AccessExclusiveLock 时的竞态条件(Simon Riggs)
有时锁会被记录为由“事务零”持有。至少已知这会在从库服务器上产生断言失败,还可能是更严重问题的原因。
在 WAL 重放期间正确跟踪 OID 计数器,即使它发生回卷(Tom Lane)
此前 OID 计数器会一直停留在高值,直到系统退出重放模式。其实际后果通常为零,但在某些场景下,已提升为主库的备库服务器在需要 OID 值时,可能要很长时间才能把 OID 计数器推进到合理的值。
防止在崩溃恢复开始时发出误导性的 “consistent recovery state reached” 日志消息(Heikki Linnakangas)
修复 pg_stat_replication.replay_location 的初始值(Fujii Masao)
此前,在至少重放一条 WAL 记录之前,显示的值是错误的。
修复带 * 的正则表达式反向引用(Tom Lane)
代码实际上并不强制精确字符串匹配,而是接受任何满足反向引用符号所引用的模式子表达式的字符串。
类似问题仍困扰着嵌入在更大带量词表达式中(而非量词直接作用对象)的反向引用。这将在未来的 PostgreSQL 版本中解决。
修复最近引入的 inet/cidr 值处理中的内存泄漏(Heikki Linnakangas)
PostgreSQL 2011 年 12 月版本中的一个补丁导致这些操作中的内存泄漏,在此类列上构建 btree 索引等场景中可能相当显著。
修复规划器通过 UNION ALL 下推索引表达式限制的能力(Tom Lane)
这类优化在 9.1.2 中被针对另一个问题的修复意外禁用。
修复继承表上 UPDATE/DELETE 中引用的 WITH 子句的规划(Tom Lane)
该缺陷导致 “could not find plan for CTE” 失败。
修复 GIN 代价估计,使其处理 column IN (...) 索引条件(Marti Raudsepp)
如果这类条件可用于 GIN 索引,这一疏忽通常会导致崩溃。
防止在会话带着打开的失败事务退出时断言失败(Tom Lane)
该缺陷对未启用断言的常规构建没有影响。
修复 SQL 语言函数中 CREATE TABLE AS/SELECT INTO 之后的悬空指针(Tom Lane)
大多数情况下这只会在启用断言的构建中导致断言失败,但似乎可能有更糟的后果。
避免 Windows 上 syslogger 中文件句柄的双重关闭(MauMau)
通常这个错误不可见,但在调试版 Windows 上运行时会导致异常。
修复 plpgsql 中与 I/O 转换相关的内存泄漏(Andres Freund、Jan Urbanski、Tom Lane)
某些操作会一直泄漏内存直到当前函数结束。
规避 perl 的 SvPVutf8() 函数中的缺陷(Andrew Dunstan)
该函数在收到类型通配或某些只读对象(如 $^V)时崩溃。让 plperl 避免把它们传给它。
在 pg_dump 中,如果扩展本身未被转储,则不转储其配置表的内容(Tom Lane)
改进 pg_dump 对继承表列的处理(Tom Lane)
pg_dump 错误处理了子列与父列默认表达式不同的情况。如果默认值在文本上与父列相同但实际不同(例如因为模式搜索路径差异),它不会被识别为不同,因此转储和恢复后子列会被允许继承父列的默认值。子列为 NOT NULL 而父列不是的情况也可能被微妙地错误恢复。
修复 pg_restore 直接写数据库模式对 INSERT 式表数据的处理(Tom Lane)
当使用 2011 年 9 月或 12 月版本的 pg_restore 时,对以 --inserts 或 --column-inserts 选项制作的归档文件直接恢复到数据库会失败,这是对另一个问题的修复中的一个疏忽所致。归档文件本身没有问题,文本模式输出也正常。
让 pg_upgrade 处理 plpython 共享库的重命名(Bruce Momjian)
由于这一疏忽,升级包含 plpython 的 9.1 之前数据库会失败。
允许 pg_upgrade 处理包含 regclass 列的表(Bruce Momjian)
由于 pg_upgrade 现在注意保留 pg_class OID,这一限制不再有任何理由存在。
让 libpq 在查找 SSL 客户端证书文件时忽略 ENOTDIR 错误(Magnus Hagander)
即使用户的主目录被设置为 /dev/null 之类,这也能建立 SSL 连接(虽然没有证书)。
修复 ecpg 的 SQLDA 区域中更多的字段对齐问题(Zoltan Boszormenyi)
允许 ecpg 的 DEALLOCATE 语句中使用 AT 选项(Michael Meskes)
支持它的基础设施已存在一段时间,但由于疏忽仍有一个错误检查拒绝这种情况。
在 ecpg 中定义 varchar 结构时不使用变量名(Michael Meskes)
修复 contrib/auto_explain 的 JSON 输出模式,使其产生有效的 JSON(Andrew Dunstan)
输出在顶层使用了方括号,而本应使用花括号。
修复 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 修复了问题,因此移除该错误检查。
允许 MinGW 构建使用标准命名的 OpenSSL 库(Tomasz Ostrowski)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。