选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.1 已于 2016 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

E.194. 版本 7.4.8 #

发行日期

2005-05-09

此发行版包含 7.4.7 之后的多种修复,包括几个与安全相关的问题。有关 7.4 主版本新特性的信息,请参阅 第 E.202 节

E.194.1. 迁移到版本 7.4.8

对于运行 7.4.X 的用户,不需要进行转储/恢复。不过,它是处理在 7.4.X 系统目录初始内容中发现的两个重要安全问题的可能方法之一。用 7.4.8 的 initdb 做转储/initdb/重载序列会自动纠正这些问题。

较大的安全问题是内建字符集编码转换函数可以由非特权用户从 SQL 命令调用,但这些函数并非为此设计,对恶意选择的参数不安全。修复包括更改这些函数的声明参数列表,使其不能再从 SQL 命令调用。(这不影响编码转换机制对它们的正常使用。)

较小的问题是 contrib/tsearch2 模块创建了几个被错误声明为返回 internal 的函数,而它们并不接受 internal 参数。这破坏了所有使用 internal 参数的函数的类型安全。

强烈建议所有安装通过 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;

然后,如果你安装了 contrib/tsearch2,执行:

BEGIN;
UPDATE pg_proc SET proargtypes[0] = 'internal'::regtype
WHERE oid IN (
   'dex_init(text)'::regprocedure,
   'snb_en_init(text)'::regprocedure,
   'snb_ru_init(text)'::regprocedure,
   'spell_init(text)'::regprocedure,
   'syn_init(text)'::regprocedure
);
-- The command should report having updated 5 rows;
-- if not, rollback and investigate instead of committing!
COMMIT;

如果此命令失败并显示类似 function "dex_init(text)" does not exist 的消息,则要么该数据库中未安装 tsearch2,要么你已经做过此更新。

上述程序必须在安装的每个数据库中执行,包括 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';

E.194.2. 变更

  • 更改编码函数签名以防止误用

  • 更改 contrib/tsearch2 以避免不安全地使用 INTERNAL 函数结果

  • 修复古老的竞态条件,它允许事务在某些用途(如 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 配置开关时发生。

  • 确保后端关闭期间完成的操作被统计收集器计数

    这有望解决关于 pg_autovacuum 不够频繁地清理系统目录的报告——它没有被通知后端退出期间临时表删除导致的目录删除。

  • plpgsql 中的额外缓冲区溢出检查(Neil)

  • 修复 pg_dump,正确转储包含 % 的触发器名(Neil)

  • 修复 contrib/pgcrypto 在较新 OpenSSL 构建上的问题(Marko Kreen)

  • contrib/intagg 的更多 64 位修复

  • 防止对返回 RECORD 的函数的错误优化

  • 防止 to_char(interval) 在月份相关格式上转储核心

  • 防止 COALESCE(NULL,NULL) 的崩溃

  • 修复 array_map,使其正确调用 PL 函数

  • 修复 ALTER DATABASE RENAME 中的权限检查

  • 修复 ALTER LANGUAGE RENAME

  • RemoveFromWaitQueue 清理自身

    这修复了一个锁管理错误,它只在事务被踢出锁等待(通常由查询取消)且锁持有者随后在极窄的窗口内释放锁时可见。

  • 修复 INSERT ... SELECT 中出现无类型参数的问题

  • 修复 ALTER TABLE SET WITHOUT OIDS 之后 CLUSTER 的失败

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。