E.276. 版本 7.4.8

E.276.1. 迁移到版本 7.4.8
E.276.2. 修改列表

发布日期:. 2005-05-09

这个版本包含各种自7.4.7以来的修复,包括几个安全相关的问题。关于7.4主版本的新特性的信息, 请查阅第 E.284 节

E.276.1. 迁移到版本 7.4.8

运行7.4.X的用户不需要转储/恢复。不过, 有可能在7.4.X系统日志最初的内容中处理两个已经发现的重大安全问题。 一个使用7.4.8的dump/initdb/reload序列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.276.2. 修改列表

  • 改变编码函数签名以阻止滥用

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

  • 修复允许一个事务因为某些原因(如SELECT FOR UPDATE)比其他原因稍早的被看做是已提交的过时的竞态条件

    这是一个非常严重的bug,因为它会导致表面上的数据不一致被应用短暂的看到。

  • 修复关系扩展和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)

  • 为更新的OpenSSL建立修复contrib/pgcrypto (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失败