E.175. 版本 7.4.8
发布日期: 2005-05-09
这个版本包含各种自7.4.7以来的修复,包括几个安全相关的问题。关于7.4主版本的新特性的信息, 请查阅Section E.183。
E.175.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.175.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
失败