リリース日: 2015-05-22
このリリースは9.2.10に対し、各種不具合を修正したものです。 9.2メジャーリリースにおける新機能については、E.102を参照してください。
9.2.Xからの移行ではダンプ/リストアは不要です。
しかしながら、contrib/citext
のregexp_matches()
関数を利用している場合は、以下にある関連する変更履歴項目を確認してください。
また、9.2.10よりも前のリリースからアップグレードする場合は、E.92を参照して下さい。
認証タイムアウトになる直前にクライアントが切断したときにクラッシュする可能性を防止しました。 (Benkocs Norbert Attila)
タイムアウト割り込みがセッション切断処理の途中で生じると、SSL関連状態が二重に解放するおそれがあり、典型的にはクラッシュを引き起こし、そのために他のセッションでもサービス不能を引き起こします。実験では認証されていないリモート攻撃者がある程度一貫して本障害を引き起こすことができたため、セキュリティ問題として扱います。 (CVE-2015-3165)
システムコールのエラー判定を改善しました。 (Noah Misch)
snprintf()
の代替実装は下にあるシステムライブラリ呼び出しから報告されるエラーの確認を怠っていました。
主な問題はメモリ不足状況を見逃すおそれがあったことです。
実装コードがバッファが上書きされていないのを上書きされたとみなしていることにより、最悪の場合には情報露出をもたらすおそれがありました。
また、他のシステムライブラリ関数呼び出しでも、エラーチェックをしていないセキュリティに関連した箇所が少しありました。
いくつかの*printf()
族関数の呼び出しで、メモリ不足エラーがちょうど悪いときに起きた場合に情報露出する脆弱性がある可能性が残ります。
私たちはリスクは大きくないと判断しましたが、該当箇所の分析は継続します。
(CVE-2015-3166)
contrib/pgcrypto
で、復号失敗を報告するメッセージを「Wrong key or corrupt data」(誤ったキーまたは不正なデータ)に統一しました。
(Noah Misch)
以前は、間違ったキーによる復号の場合には異なったエラーメッセージが報告されていました。
この様なエラーメッセージの違いは、他システムからキーを復元しようとする攻撃者への助けになるとみられます。
pgcrypto
のこの振る舞いが攻撃に利用できるかは不明ですが、一つの何にでも当てはまるメッセージを使う方がリスクを避けるのにより良いと考えられます。
(CVE-2015-3167)
contrib/citext
のregexp_matches()
関数の誤った宣言を修正しました。
(Tom Lane)
この関数は本体関数と同様にsetof text[]
を返すべきでしたが、誤って単にtext[]
を返すように宣言されていました。
この誤りは二つの結果をもたらしました。
第一にマッチするものが無いときに空集合(ゼロ行)を得るべきところ、スカラnullを得ます。
第二にたとえ複数のマッチがあったとしても一つの結果配列しか得られないことから、g
フラグが事実上無視されていました。
この振る舞いは明らかにバグですが、以前の振る舞いに依存したアプリケーションがありえます。
そのため、PostgreSQL 9.5になるまでは関数宣言はデフォルトでは変更しません。
9.5より前の系列では、従来の振る舞いがcitext
拡張モジュールのバージョン1.0として存在し、その一方で私たちは正しい宣言をバージョン1.1として提供します(これはデフォルトではインストールされません)。
9.5より前の系列で修正を適用するには、citext
をインストールした各データベースでALTER EXTENSION citext UPDATE TO '1.1'
を実行します(必要に応じて1.0に戻す「UPDATE」も可能です)。
どちらの方向にバージョン変更する場合でも、citext
のregexp_matches()
関数を使った全てのビューやルールを削除して再作成する必要があることに注意してください。
HOT更新後の遅延排他制約の誤った検査を修正しました。 (Tom Lane)
遅延排他制約に違反する可能性のある新しい行が同じトランザクションで後でHOT更新された(インデックスが付かない列の更新でその行が同テーブルページ内に格納できた)場合、後に削除される行が、新たな行と当初に衝突していた場合でも、排他制約は最後に行われる検査で違反を報告することがありました。
スタースキーマ風の問い合わせのプラン作成を修正しました。 (Tom Lane)
大きなテーブルの効率的なスキャンでは時に、二つ以上の他テーブル(一般にはディメンションテーブル、それらのキーは大きいファクトテーブルでインデックス付けが必要)から供されるインデックスパラメータが要求されます。 プランナはこのようなプランを探せなければいけませんが、過度に制限的な検索ヒューリスティックがこれを妨げていました。
他の外部結合に対する anti-join (NOT EXISTS 結合) の不適切な配置換えを防止しました。 (Tom Lane)
プランナのこの誤りにより「could not find RelOptInfo for given relids」エラーが見られましたが、しかし時には誤ったクエリプランが一貫性チェックを通過して、黙って誤ったクエリ出力が生じることがあると考えられます。
外部結合プランノードでの部分式の誤ったマッチングを修正しました。 (Tom Lane)
これまでは、字面として同一の非STRICTの部分式が外部結合の上位と下位の両方で使われているとき、プランナが結合の下位で計算した値を再利用しようとすることがありましたが、エグゼキュータは外側の行にマッチしない場合は値をNULLに強制するはずなので、これは正しくありません。
結合順序のヒューリスティックが失敗した場合に対応できるようにGEQOプランナを修正しました。 (Tom Lane)
この誤りがLATERAL
を含む問い合わせでエラー「failed to join all relations together」(全てのリレーションを一緒に結合するのに失敗しました)を導くのが見かけられ、また、そのほかの場合でも起きるようです。
max_prepared_transactions
が小さすぎるとき、PostgreSQL起動時にデッドロックの可能性があり、修正しました。
(Heikki Linnakangas)
タイムライン切り替え後、使えない事前割り当てされたWALファイルをアーカイブしないようにしました。 (Heikki Linnakangas)
「cannot GetMultiXactIdMembers() during recovery」(リカバリ中にGetMultiXactIdMembers()は実行できません)というエラーが発生しないようにしました。 (Álvaro Herrera)
クラッシュ後に再帰的にfsync()
を行うようにしました。
(Abhijit Menon-Sen, Robert Haas)
これにより別のクラッシュがすぐ後に生じた場合でも一貫性を確実にします(問題となるのは二番目のクラッシュが単なるデータベースクラッシュではなくシステムレベルのクラッシュである場合です)。
SIGTERMシグナルを受け取った後にエラーが起きた場合に、autovacuumランチャープロセスがシャットダウンに失敗する可能性があったのを修正しました。 (Álvaro Herrera)
LockBufferForCleanup()
で予期せぬシグナルに対応するようにしました。
(Andres Freund)
この誤りは「multiple backends attempting to wait for pincount 1」(複数バックエンドがピンカウント1を待とうとしています)という偽性のエラーをひき起こすことがあります。
行全体の参照を含むチェック制約の付いたテーブルに対するCOPY IN
実行時のクラッシュを修正しました。
(Tom Lane)
知られている失敗ケースでは9.4以上のみクラッシュしますが、非常に似たコードが9.3と9.2にあるので、これらのバージョン系列も同様に修正します。
read-only であるトランザクションのコミットにおいては、当該のユーザに限り、WALフラッシュや同期レプリケーションを待たないようにしました。 (Andres Freund)
これまでは、HOTページ掃除のためにWALを書くトランザクションのコミットにて遅延がおきる可能性があり、全スタンバイがダウンしている場合には、セッションが開始時に固まってしまうなどの望ましくない結果に至りました。 同期レプリケーションのときのキャッチアップ割り込み処理でもセッションが固まることがありました。 本修正はこれらの問題を解消します。
一時テーブル上のハッシュインデックスを操作するときに生じるクラッシュを修正しました。 (Heikki Linnakangas)
他プロセスが同時にインデックスを変更している場合、ハッシュインデックスのバケツ分割に失敗する可能性があり、修正しました。 (Tom Lane)
インデックス式のANALYZE中に割り込みを検査するようにしました。 (Jeff Janes)
ANALYZE
ではインデックスの式を何度も実行します。
こういった式の中に遅い関数があった場合、ANALYZE
をループが終わる前にキャンセルできることが望まれます。
SELECT FOR UPDATE
、UPDATE
、または、DELETE
での行ロック後にREAD COMMITTED
再チェックが生じたときに、外部テーブルのtableoid
が確実に正しく報告されるようにしました。
外部サーバユーザマッピングのオブジェクト説明文字列にターゲットサーバ名を追加しました。 (Álvaro Herrera)
Kerberos/GSSAPI/SSPI認証を使うとき、include_realm
を1に設定することを推奨します。
(Stephen Frost)
これが無いと、他レルムからの同名ユーザが区別できません。 当面はドキュメント変更のみですが、これはPostgreSQL 9.5でデフォルト設定になります。
IPv4のpg_hba.conf
項目をIPv4-in-IPv6アドレスと照合する実装を除去しました。
(Tom Lane)
この実装は2003年にその時の一部のLinuxカーネルでIPv4-in-IPv6アドレスを持ちながらIPv4接続を報告するというレポートに応えて追加されました。
しかしながら、このロジックは9.0で図らずも壊れていました。
それ以来、どこにも苦情が無いことは、それがもう必要でないことを示しています。
現在、壊れた実装が一部システムでクラッシュをひき起こすという報告がされているので、これを修正するのでなく、単に除去します
(私たちが修正することを選んだなら、それは IPv4のpg_hba.conf
項目の現在の意味に対する、微妙で潜在的にセキュリティ影響のある変更に向かい、これはマイナーリリースで行うこととして良いことではありません)。
レプリケーションコマンドIDENTIFY_SYSTEM
でWAL挿入でなくWALフラッシュ位置を報告するようにしました。
(Heikki Linnakangas)
これによりpg_receivexlogの起動失敗の可能性を回避します。
Windows でサービスシャットダウンするときに、サービスが早くに強制終了されてしまうのを防ぐために、サービスコントロールマネージャに周期的に状態更新を送るようにしました。 また、pg_ctlが確実にシャットダウンを待つようにしました。 (Krystian Bigaj)
libpqのノンブロッキングモードを使うとき、ネットワークデッドロックの危険性を軽減しました。 (Heikki Linnakangas)
大きいデータを送るとき、サーバが出力をブロックするほどの応答データを送ってくる場合には、時々に入力バッファが捌けることが重要です
(典型的なシナリオは、サーバがCOPY FROM STDIN
の実行中に連続して NOTICE メッセージを送ってくる場合です)。
このとき、通常のブロッキングモードなら適切に動作しますが、ノンブロッキングモードの場合はそうではありません。
私たちはlibpqを日和見的に可能なときに入力を排出するように修正しましたが、この問題に対する完全な対策にはアプリケーションの協力が必要です。
アプリケーションは write-ready 状態だけでなく、read-ready に気を付けなければならず、read-ready に応じて確実にPQconsumeInput()
を呼ばなければいけません。
libpqにおけるURI接続文字列の空値の構文解析誤りを修正しました。 (Thomas Fanghaenel)
ecpgで配列の扱いが修正されました。 (Michael Meskes)
\connect
の最初の引数として、URIと接続文字列を正常に扱えるようにpsqlを修正しました。
(David Fetter, Andrew Dunstan, Álvaro Herrera)
この構文は(ドキュメント化されていませんが)永らく受け入れられてきました。 しかし、これまで一部パラメータにて与えられた文字列でなく以前の接続から取得されることがあり、これは望ましくない動作であると合意されています。
一部のプラットフォームでpsqlから終了時に~/.psql_history
を書くのに失敗したという間違ったエラーメッセージがでるのを抑止しました。
(Tom Lane)
この誤動作はとても古いバージョン(2006年より前)のlibeditのバグを回避するために引き起こされました。 私たちはその回避策を取り除くことで修正しました。 このことで古いバージョンのlibeditを使っている場合、同様の障害を引き起こします。 ライブラリをアップグレードするかlibreadlineを使うことを推奨します。
pg_dumpのシステム提供されたダンプ不要のキャストを判断する規則を修正しました。 (Tom Lane)
pg_dumpで、-Fd
と一緒に指定された場合に -Z
圧縮レベル オプションを尊重するように修正しました。
(Michael Paquier)
pg_dumpを、ダンプ順序の選択で、拡張モジュールの設定テーブル間の外部キー関係を考慮するようにしました。 (Gilles Darold, Michael Paquier, Stephen Frost)
この誤りで、外部キー制約が一時的に違反になるために再ロードできないダンプを作ってしまう可能性がありました。
VALUES (...) だけであるけれどカラム別名を持つビューのダンプについて修正しました。 (Tom Lane)
pg_upgradeで、新たなクラスタのタイムラインを強制的に1にするようにしました。 (Bruce Momjian)
この変更は、WALヒストリファイルが無いという誤ったエラーによるアップグレード失敗を防ぎます。
pg_upgradeで、不適切な接続不能データベースが無いか処理前に検査するようにしました。 (Bruce Momjian)
pg_upgradeで、生成されるdelete_old_cluster
スクリプトの中でディレクトリパスを適切にクオートするようにしました。
(Bruce Momjian)
pg_upgradeで、データベースレベルの凍結情報を適切に保持するようにしました。 (Bruce Momjian)
この誤りはpostgres
データベースとtemplate1
データベースのテーブルに対してclogファイルが無いというエラーを引き起こす可能性がありました。
Administratorで実行しても失敗しないように、Windows上でpg_upgradeとpg_resetxlogを制限された権限で実行するようにしました。 (Muhammad Asif Naeem)
initdbとpg_basebackupでディレクトリを読み取るときに、readdir()
が失敗した場合の扱いを改善しました。
(Marco Nenciarini)
pg_receivexlogが失敗する問題を修正しました。 (Andres Freund)
9.2.10で誤ってマージされたパッチは「could not create archive status file」(アーカーブステータスファイルを作成することができません)というエラーを引き起こしていました。
contrib/intarray
で遅いソートアルゴリズムを修正しました。
(Tom Lane)
Sparc V8 マシンでのコンパイル失敗を修正しました。 (Rob Rowan)
タイムゾーンデータファイルが、エジプト、モンゴル、パレスチナにおける夏時間規則の変更、カナダ、チリの歴史的変更、America/Adak の時間帯省略形の改定(HAST/HADT でなく HST/HDT となる)が含まれるtzdata release 2015d に更新されました。