PostgreSQL 8.0.25 に関する技術情報

このリリースは 8.0.24 からの修正リリース(2010/05/17リリース)です。
8.0.x からのアップデートではダンプ、リストアは不要です。

また、8.0.22 より前のバージョンからアップデートを行う場合は 8.0.22 に関する技術情報を参照してください。

PostgreSQL 8.0.24 から 8.0.25 への変更点

8.4.4、8.3.11、8.2.17、8.1.21、8.0.25、7.4.29 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。

※ 各項目のカッコ内は担当した開発者名と該当するメジャーバージョン系列です。


  1. Safe.pm を使う代わりにインタプリタ全体に opmask を適用することで、手続き言語 PL/Perl の制限が強化されました。(Tim Bunce, Andrew Dunstan) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)

    近年の情勢から PL/Perl の信頼性を実現するのに Safe.pm に依存するのは安全ではないと判断されました。この変更により、常に適用される opecode マスクでインタプリタを分離するため、Safe.pm 利用は全体的に除かれます。これにより Perl の strict プラグマを自然な方法で plperl の中で使えます。また、Perl の変数はソートルーチンで期待通りに動作し、その関数コンパイルはかなり高速になります。(CVE-2010-1169)

  2. 手続き言語 PL/Tcl のモジュール(pgtcl_modules)で信頼できないコードを実行することが禁止されました。(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)

    データベーステーブルから Tcl コードを自動ローディングする PL/Tcl の仕様は、そのテーブルに対するデータ投入に対して何ら制限がかかっていないため、トロイ木馬攻撃で乗っ取りが可能でした。本変更は pltcl_modules がスーパーユーザの所有でないかぎり、テーブルからの自動コードローディングを禁止します。

    (しかし、テーブル上の権限はチェックされないので、本当により安全でないモジュールテーブルを必要とするインストレーションは信用された非スーパーユーザに適当な特権を与えることができます。)

    また、信頼されていない通常の Tclインタプリタ(PL/TclU)についても、関数を実際に実行するまでは、コードローディングを行なわせません。(CVE-2010-1170)

  3. ALTER ... SET TABLESPACE の WAL を適用する際にデータが壊れる問題が修正されました。(Tom) (8.4)

    archive_mode = on のとき、ALTER ... SET TABLESPACE 命令は、誤った再実行ロジックのWALレコードを生成していました。これにより誤った場所にデータを書き込んでしまい、リカバリ不能のデータ破損を引き起こしていました。

    これは(ウォームスタンバイ構成の)スレーブサーバや、ALTER を実行して次のチェックポイントの手前のタイミングでのクラッシュリカバリにて発生します。

  4. relcache の登録内容を再構築している間に、これをリセットさせるメッセージを受けたときにクラッシュする可能性があったものが修正されました。relcache とは、システムテーブルのテーブル定義情報をメモリ上にキャッシュしたものです。(Heikki) (8.4)

    この障害は 8.4.3 の修正で導入されてしまったものです。

  5. 関数ごとの GUC 設定を、関数定義内容の検証をしているときにも適用するようになりました。(Itagaki Takahiro) (8.4)(8.3)

    これにより関数のコードが GUC 設定無しには不正な内容である場合、例えば search_path の設定を必要とするとき、エラーになることを防ぎます。

  6. 設定が constraint_exclusion = partition であるとき、継承テーブルに対する UPDATEDELETE がテーブル制約を使用した動作をするようになりました。(Tom) (8.4)

    仕様としては本来このようになるはずであったものが、不注意のため、この設定が SELECT コマンドにしか効いていませんでした。

  7. 権限のないユーザがスーパーユーザ限定の設定をリセットするのを許可しないようになりました。(Alvaro) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)

    ALTER コマンドで、ユーザ(ロール)ごと、データベースごとに、GUC 設定を付加することができます。この機能に関する修正(仕様変更)です。

    これまでは、権限の無いユーザが ALTER USER ... RESET ALL を自身に対して実行したり、ALTER DATABASE ... RESET ALL を自身が所有者であるデータベースに対して実行したりした場合、その設定項目がスーパーユーザ限定の設定項目であってもユーザ・データベースから設定を取り除くことができていました。本修正にて、ユーザが変更可能な項目のみ ALTER で設定を外すことができるようになります。

  8. ログ項目に「CONTEXT: 〜」を追加しているときシャットダウンがおきると、バックエンドプロセスのシャットダウンでクラッシュする可能性があったものを回避するようになりました。(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)

    ログメッセージを出力するときに実行中トランザクションが既にロールバック状態であることから、コンテキスト出力が失敗することが考えられます。

    「CONTEXT:」で始まるメッセージは PL/pgSQL のエラーなどで生成されます。

  9. recovery.conf の設定項目 recovery_end_command にて、%r が正しく処理されていなかったものが修正されました。(Heikki) (8.4)

    この値には常にゼロ(000000000000000000000000)が入っていました。本来は %r にはリストアを再開させることができるようにするため保存されなくてはならない一番古い WAL ファイル名が入ります。

  10. アーカイバプロセス(archiver process)が、設定 archive_command の変更に対して、可能な限り素早く反応することが保証されるようになりました。(Tom) (8.4)(8.3)
  11. PL/pgSQL の CASE 文が、クエリーを式として与えられていて結果がゼロ行を返したときに、失敗しないように修正されました。(Tom) (8.4)
  12. 新しい Perl バージョンに合わせて PL/Perl の ppport.h が更新されました。(Andrew) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
  13. PL/Python の様々なメモリリークが修正されました。(Andreas Freund, Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
  14. ecpg で接続パラメータとして空文字列を正しく扱えるようになりました。(Michael) (8.4)
  15. psql で自己参照をしている変数を展開するときに、無限再帰処理が発生するのを防ぐようになりました。(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)

    障害は以下の手順で発生します。

     =# \set n 1
     =# \set n (:n + 1)
     =# SELECT :n ;
  16. psql の \copy コマンド が、\copy ( select文 ) という構文のときに「.」や「,」の周囲に空白文字を追加しないように修正されました。(Tom) (8.4)(8.3)(8.2)

    以下のような例が報告されています。

    => \copy (select 1.0) to test.tst
    ERROR:  syntax error at or near "."
    LINE 1: COPY ( select 1 . 0 ) TO STDOUT
  17. psql が、設定 client_encoding とロケールが適合していないときに、フォーマットに失敗するのが回避されるようになりました。(Tom) (8.4)
  18. contrib/intarray の演算子を使ったとき、不適切なクエリに対して、"GIN indexes do not support whole-index scans" という不要なエラーがでるのが修正されました。(Tom) (8.4)(8.3)
  19. contrib/pgstattuple の関数がプロンプトからのキャンセル割り込みに確実に応するようになりました。(Tatsuhito Kasahara) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
  20. shmget() が存在する共有メモリセグメントに対して EINVAL を返したときにも、サーバ起動プロセスが適切に動作するようになりました。(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)

    Mac OS X を含む BSD 系のカーネルで問題がおきていて、共有メモリ要求サイズが大きすぎるという誤った起動失敗のメッセージを引き起こしていました。shmget() は PostgreSQL内部で使われている OS の SysV 共有メモリを操作するシステムコールの一つです。

  21. Windows 上の syslogger プロセスがクラッシュする可能性を避けるようになりました。(Heikki) (8.4)(8.3)(8.2)
  22. Windowsレジストリにおける不完全なタイムゾーン情報に対して、より頑健に処理するようになりました。(Magnus) (8.4)(8.3)(8.2)
  23. 既知の Windows タイムゾーン名がいくつか更新されました。(Magnus) (8.4)(8.3)(8.2)
  24. タイムゾーンデータが tzdata リリース 2010j に更新されました。(8.4)(8.3)(8.2)

    アルゼンチン、オーストラリア(南極地域)、バングラディシュ、メキシコ、モロッコ、パキスタン、パレスチナ、ロシア、シリア、チュジジアの夏時間の変更に対応しています。台湾の歴史的な修正も行われています。

    また、PKST(パキスタンの夏時間)がデフォルトのタイムゾーン略記法に加わっています。