技術情報
PostgreSQL 8.2.17 に関する技術情報
PostgreSQL 8.2.16 から 8.2.17 への変更点
リリース日:2010/05/17
掲載日:2010/05/18
このリリースは 8.2.16 からの修正リリースです。
8.2.X から 8.2.16 へのマイナーバージョンアップではダンプ/リストアは不要です。
※ 各項目のカッコ内は担当した開発者名と該当するメジャーバージョン系列です。
- 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)
- 手続き言語 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)
ALTER ... SET TABLESPACEの WAL を適用する際にデータが壊れる問題が修正されました。 (Tom) (8.4)archive_mode = on のとき、
ALTER ... SET TABLESPACE命令は、誤った再実行ロジックのWALレコードを生成していました。 これにより誤った場所にデータを書き込んでしまい、リカバリ不能のデータ破損を引き起こしていました。これは(ウォームスタンバイ構成の)スレーブサーバや、
ALTERを実行して次のチェックポイントの手前のタイミングでのクラッシュリカバリにて発生します。- relcache の登録内容を再構築している間に、これをリセットさせるメッセージを受けたときにクラッシュする可能性があったものが修正されました。
relcache とは、システムテーブルのテーブル定義情報をメモリ上にキャッシュしたものです。
(Heikki) (8.4)
この障害は 8.4.3 の修正で導入されてしまったものです。
- 関数ごとの GUC 設定を、関数定義内容の検証をしているときにも適用するようになりました。
(Itagaki Takahiro) (8.4)(8.3)
これにより関数のコードが GUC 設定無しには不正な内容である場合、例えば search_path の設定を必要とするとき、エラーになることを防ぎます。
- 設定が constraint_exclusion = partition であるとき、継承テーブルに対する
UPDATE、DELETEがテーブル制約を使用した動作をするようになりました。 (Tom) (8.4)仕様としては本来このようになるはずであったものが、不注意のため、この設定が
SELECTコマンドにしか効いていませんでした。 - 権限のないユーザがスーパーユーザ限定の設定をリセットするのを許可しないようになりました。
(Alvaro) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
ALTERコマンドで、ユーザ(ロール)ごと、データベースごとに、GUC 設定を付加することができます。 この機能に関する修正(仕様変更)です。これまでは、権限の無いユーザが
ALTER USER ... RESET ALLを自身に対して実行したり、ALTER DATABASE ... RESET ALLを自身が所有者であるデータベースに対して実行したりした場合、 その設定項目がスーパーユーザ限定の設定項目であってもユーザ・データベースから設定を取り除くことができていました。 本修正にて、ユーザが変更可能な項目のみALTERで設定を外すことができるようになります。 - ログ項目に「CONTEXT: 〜」を追加しているときシャットダウンがおきると、バックエンドプロセスのシャットダウンでクラッシュする可能性があったものを
回避するようになりました。
(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
ログメッセージを出力するときに実行中トランザクションが既にロールバック状態であることから、コンテキスト出力が失敗することが考えられます。
「CONTEXT:」で始まるメッセージは PL/pgSQL のエラーなどで生成されます。
- recovery.conf の設定項目 recovery_end_command にて、%r が正しく処理されていなかったものが修正されました。
(Heikki) (8.4)
この値には常にゼロ(000000000000000000000000)が入っていました。 本来は %r にはリストアを再開させることができるようにするため保存されなくてはならない一番古い WAL ファイル名が入ります。
- アーカイバプロセス(archiver process)が、設定 archive_command の変更に対して、可能な限り素早く反応することが保証されるようになりました。 (Tom) (8.4)(8.3)
- PL/pgSQL の
CASE文が、クエリーを式として与えられていて結果がゼロ行を返したときに、失敗しないように修正されました。 (Tom) (8.4) - 新しい Perl バージョンに合わせて PL/Perl の ppport.h が更新されました。 (Andrew) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
- PL/Python の様々なメモリリークが修正されました。 (Andreas Freund, Tom) (8.4)(8.3)(8.2)(8.1)(8.0)(7.4)
- ecpg で接続パラメータとして空文字列を正しく扱えるようになりました。 (Michael) (8.4)
- psql で自己参照をしている変数を展開するときに、無限再帰処理が発生するのを防ぐようになりました。
(Tom) (8.4)(8.3)(8.2)(8.1)(8.0)
障害は以下の手順で発生します。
=# \set n 1 =# \set n (:n + 1) =# SELECT :n ;
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
Mac OS X を含む BSD 系のカーネルで問題がおきていて、共有メモリ要求サイズが大きすぎるという誤った起動失敗のメッセージを引き起こしていました。 shmget() は PostgreSQL内部で使われている OS の SysV 共有メモリを操作するシステムコールの一つです。
アルゼンチン、オーストラリア(南極地域)、バングラディシュ、メキシコ、モロッコ、パキスタン、パレスチナ、ロシア、シリア、チュジジアの夏時間の変更に対応しています。 台湾の歴史的な修正も行われています。
また、PKST(パキスタンの夏時間)がデフォルトのタイムゾーン略記法に加わっています。


