E.20. 版本 9.1.5 #
发行日期
2012-08-17
本次发布包含对 9.1.4 的多方面修复。有关 9.1 大版本中新特性的信息,请参见第 E.25 节。.
E.20.2. 变更
防止通过 XML 实体引用访问外部文件/URL(Noah Misch、Tom Lane)
xml_parse()会尝试按需获取外部文件或 URL 来解析 XML 值中的 DTD 和实体引用,从而使无特权数据库用户能够尝试以数据库服务器的权限获取数据。虽然外部数据不会直接返回给用户,但如果数据不能解析为有效 XML,其部分内容可能暴露在错误消息中;而且无论如何,仅仅能够检查文件是否存在对攻击者就可能有用。(CVE-2012-3489)防止通过
contrib/xml2的xslt_process()访问外部文件/URL(Peter Eisentraut)libxslt 提供通过样式表命令读写文件和 URL 的能力,从而使无特权数据库用户能够以数据库服务器的权限读写数据。现通过正确使用 libxslt 的安全选项禁用该能力。(CVE-2012-3488)
此外,移除了
xslt_process()从外部文件/URL 获取文档和样式表的能力。虽然这是一个有记载的“特性”,但长期以来被认为是个坏主意。CVE-2012-3489 的修复破坏了该能力,与其花费精力修复它,我们干脆将其移除。防止 btree 索引页被过早回收(Noah Misch)
当我们允许只读事务跳过分配 XID 时,引入了已删除 btree 页在只读事务仍在访问它时就被回收的可能性。这会导致错误的索引搜索结果。由于时序要求,这种错误在实际中发生的概率似乎很低,但仍应修复。
修复新创建或重置序列的崩溃安全缺陷(Tom Lane)
如果在新创建或重置的序列上执行了
ALTER SEQUENCE,然后恰好对它调用了一次nextval(),随后服务器崩溃,WAL 重放会把序列恢复到看起来没有执行过nextval()的状态,从而使下一个nextval()调用再次返回第一个序列值。这种情况尤其可能出现在serial列上,因为创建 serial 列的序列包含一个ALTER SEQUENCE OWNED BY步骤。修复
enum类型值比较中的竞态条件(Robert Haas、Tom Lane)当遇到当前查询启动之后添加的枚举值时,比较可能失败。
修复
txid_current(),使其在非热备下报告正确的纪元(epoch)(Heikki Linnakangas)这修复了上一个小版本引入的退化。
防止选择不合适的复制连接作为同步备库(Fujii Masao)
主库可能不当地选择 pg_receivexlog 或 pg_basebackup 等伪服务器作为同步备库,然后无限期等待它们。
修复主库事务有大量子事务时热备启动的缺陷(Andres Freund)
这一失误导致报告为 “out-of-order XID insertion in KnownAssignedXids” 的失败。
确保
pg_start_backup()之后对backup_label文件执行 fsync(Dave Kerr)修复 walsender 进程中的超时处理(Tom Lane)
WAL 发送端后台进程疏于建立 SIGALRM 处理程序,这意味着在某些应发生超时的极端情况下它们会永远等待。
在 walwriter 每次后台刷写之后唤醒 walsender(Andres Freund、Simon Riggs)
当负载只包含异步提交的事务时,这能大幅减少复制延迟。
修复
LISTEN/NOTIFY,使其更好地应对 I/O 问题(例如磁盘空间耗尽)(Tom Lane)写入失败之后,所有后续发送更多
NOTIFY消息的尝试都会失败,并显示诸如 “Could not read from file "pg_notify/nnnn" at offsetnnnnn: Success” 的消息。只允许被直接阻塞的进程自动取消自动清理(Tom Lane)
原始编码在某些情况下可能允许不一致的行为;特别是自动清理可能在不足
deadlock_timeout宽限期之后就被取消。改进自动清理取消的日志记录(Robert Haas)
修复日志收集器,使
log_truncate_on_rotation在服务器启动后的第一次日志轮转期间就能工作(Tom Lane)修复附加到嵌套集合操作(
UNION/INTERSECT/EXCEPT)上的WITH(Tom Lane)确保对子查询的整行引用不包含任何多余的
GROUP BY或ORDER BY列(Tom Lane)修复
ALTER TABLE ... ADD CONSTRAINT USING INDEX期间生成的依赖(Tom Lane)该命令为索引留下了一个多余的
pg_depend条目,可能干扰后续操作,尤其是对被索引列之一的ALTER TABLE ... ALTER COLUMN TYPE。修复
REASSIGN OWNED,使其能用于扩展(Alvaro Herrera)禁止在
CREATE TABLE期间复制CHECK约束和索引定义中的整行引用(Tom Lane)这种情况可能出现在带
LIKE或INHERITS的CREATE TABLE中。被复制的整行变量被错误地标记为原表而不是新表的行类型。对LIKE拒绝这种情况似乎是合理的,因为行类型之后很可能分化。对INHERITS,理想情况下应该允许它,并隐式强制转换为父表的行类型;但这需要的工作量超出了回移植的安全范围。修复
ARRAY(SELECT ...)子查询中的内存泄漏(Heikki Linnakangas、Tom Lane)修复规划器,使其向操作符选择率估计器传递正确的排序规则(Tom Lane)
此前任何核心选择率估计函数都不需要它,但第三方代码可能需要。
修复从正则表达式中提取公共前缀的问题(Tom Lane)
代码可能被带量词的带括号子表达式(例如
^(foo)?bar)混淆。这会导致对此类模式搜索的索引优化不正确。修复解析
interval常量中带符号的hh:mm和hh:mm:ss字段的缺陷(Amit Kapila、Tom Lane)修复 pg_dump,使其更好地处理包含部分
GROUP BY列表的视图(Tom Lane)只在
GROUP BY中列出主键列、却把其他表列当作已分组的视图,会被标记为依赖于该主键。pg_dump 对这类主键依赖处理不当会导致转储顺序不佳,往好里说恢复效率低下,往坏里说可能导致并行 pg_restore 彻底失败。在 PL/Perl 中,避免在 SQL_ASCII 编码下设置 UTF8 标志(Alex Hunsaker、Kyotaro Horiguchi、Alvaro Herrera)
在 PL/Python 中把 Python Unicode 字符串转换为服务器编码时,使用 Postgres 而不是 Python 的编码转换函数(Jan Urbanski)
这避免了一些极端情况的问题,尤其是 Python 并不支持 Postgres 的所有编码。一个显著的功能变化是:如果服务器编码是 SQL_ASCII,你将得到该字符串的 UTF-8 表示;此前字符串中的任何非 ASCII 字符都会导致错误。
修复 PL/Python 中 PostgreSQL 编码到 Python 编码的映射(Jan Urbanski)
修复
contrib/xml2的xslt_process()中的错误报告(Tom Lane)把时区数据文件更新为 tzdata 版本 2012e,以反映摩洛哥和托克劳的夏令时法规变更