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

# E.231. 版本 7.3.10

> 发布日期: 2005-05-09

这个版本包含各种自7.3.9以来的补丁，包括几个安全相关的问题。

## E.231.1. 迁移到版本 7.3.10

运行7.3.X的不需要转储/恢复。不过， 转储/恢复是处理在7.3.X系统目录中的初始化内容中发现的重大安全问题的一种方式。 使用7.3.10的initdb的dump/initdb/reload序列将自动改正这个问题。

安全问题是非特权用户可以通过SQL命令引用内建字符设置编码转换函数， 但是该函数不是这样使用的，并且对于恶意的参数选择是不安全的。 修复包括改变这些函数声明的参数列表，这样它们可以不再被SQL命令调用。 （这样并不影响它们通过编码转换机制的正常使用。） 强烈推荐所有安装修复这个错误，通过initdb或通过下面给出的手动修复过程。 该错误至少允许非特权数据库用户毁坏他们的服务器进程， 甚至可能允许非特权用户获得数据库超级用户的权限。

如果你希望不做initdb，那么执行下列的过程。作为数据库超级用户，执行：

    BEGIN;
    UPDATE pg_proc SET proargtypes[3] = 'internal'::regtype
    WHERE pronamespace = 11 AND pronargs = 5
         AND proargtypes[2] = 'cstring'::regtype;
    -- 该命令应该报告已经更新了90行;
    -- 如果不是，那么回滚并调查而不是提交!
    COMMIT;

上面的程序必须在每个安装的数据库中执行，包括`template1`， 并且理论上也包括`template0`。如果你不修复模板数据库， 那么任何随后创建的数据库将包含相同的错误。`template1` 可以用与任意其他数据库相同的方式修复，但是修复`template0` 需要额外的步骤。首先，从任意数据库发出：

    UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';

然后连接到`template0`并执行以上所述的修复程序。最后，执行：

    -- 重新冻结template0:
    VACUUM FREEZE;
    -- 保护它免受未来的变化:
    UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

## E.231.2. 修改列表

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

- 修复古老竞态条件，该条件允许一个事务因为某些目的(如 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`配置开关的时候发生。

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

- 修复pg_dump转储触发器名字正确的包含`%`(Neil)

- 阻止`to_char(interval)`为月份相关的格式转储内核

- 为更新的OpenSSL构建修复`contrib/pgcrypto`(Marko Kreen)

- 为`contrib/intagg`修复更多的64位问题

- 阻止返回`RECORD`的函数的不正确的最优化

上一页 | 起始页 | 下一页
版本 7.3.11 | 上一级 | 版本 7.3.9