pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
2005-05-09
本次发布包含对 7.3.9 的多方面修复,其中包括若干与安全相关的问题。
对于运行 7.3.X 的用户,不需要进行转储/恢复。不过,它是处理在 7.3.X 系统目录初始内容中发现的一个重要安全问题的可行方式之一。 使用 7.3.10 的 initdb 执行转储/initdb/重载序列将自动更正此问题。
该安全问题在于:内置字符集编码转换函数可以由无特权用户通过 SQL 命令调用,但这些函数并非为这种用法设计,无法防御恶意选择的参数。 修复方式是更改这些函数的声明参数列表,使它们不再能从 SQL 命令中 调用。(这不影响编码转换机制对它们的正常使用。)强烈建议所有安装 通过 initdb 或按照下文给出的手动修复步骤来修复此错误。该错误至少 允许无特权的数据库用户使其服务器进程崩溃,并且可能允许无特权用户 获得数据库超级用户的权限。
如果你不希望做 initdb,可以改为执行以下步骤。以数据库超级用户 身份执行:
BEGIN;
UPDATE pg_proc SET proargtypes[3] = 'internal'::regtype
WHERE pronamespace = 11 AND pronargs = 5
AND proargtypes[2] = 'cstring'::regtype;
-- The command should report having updated 90 rows;
-- if not, rollback and investigate instead of committing!
COMMIT;
上述步骤必须在安装的每个数据库中执行,包括 template1,理想情况下还包括 template0。 如果不修复模板数据库,随后创建的任何数据库都将包含同样的错误。 template1 可以像任何其他数据库一样修复,但修复 template0 需要额外的步骤。首先,从任意数据库执行:
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
接着连接到 template0 并执行上述修复步骤。最后执行:
-- re-freeze template0: VACUUM FREEZE; -- and protect it against future alterations: UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
更改编码函数的签名以防止误用
修复一个古老的竞态条件:它允许一个事务在某些用途上 (例如 SELECT FOR UPDATE)比在其他用途上稍早被看作已提交
这是一个极其严重的缺陷,因为它可能导致应用程序短暂地看到表面 上的数据不一致。
修复关系扩展与 VACUUM 之间的竞态条件
理论上这可能造成丢失一整页新插入的数据,尽管该场景发生的概率似 乎极低。尚无已知案例表明它造成过比断言失败更严重的后果。
修复 TIME WITH TIME ZONE 值的比较
在使用了 --enable-integer-datetimes 配置开关的情况下,比较 代码是错误的。注意:如果你在 TIME WITH TIME ZONE 列上有索引, 在安装此更新后需要对其执行 REINDEX,因为此修复更正了列值 的排序顺序。
修复 TIME WITH TIME ZONE 值的 EXTRACT(EPOCH)
修复 INTERVAL 值中负小数秒的显示错误
此错误只在使用了 --enable-integer-datetimes 配置开关时 发生。
plpgsql 中更多的缓冲区溢出检查(Neil)
修复 pg_dump,使其能正确转储包含 % 的触发器 名(Neil)
防止 to_char(interval) 在与月份相关的格式 下转储核心
修复 contrib/pgcrypto 以适配较新的 OpenSSL 构建(Marko Kreen)
contrib/intagg 的更多 64 位修复
防止对返回 RECORD 的函数的不正确优化
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。