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