版本 7.4.8

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 E. 版本说明 | 下一页

# E.211. 版本 7.4.8

> 发布日期: 2005-05-09

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

## E.211.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.211.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`失败

上一页 | 起始页 | 下一页
版本 7.4.9 | 上一级 | 版本 7.4.7