リリース日: 2015-05-22
このリリースは9.4.1に対し、各種不具合を修正したものです。 9.4メジャーリリースにおける新機能については、E.52を参照してください。
9.4.Xからの移行ではダンプ/リストアは不要です。
しかしながら、contrib/citext
のregexp_matches()
関数を使っているのであれば、以下にある関連する変更履歴項目を確認してください。
また、9.4.1よりも前のリリースからアップグレードする場合は、E.51を参照して下さい。
認証タイムアウトになる直前にクライアントが切断したときにクラッシュする可能性を防止しました。 (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)
マルチトランザクションメンバIDの周回を防止しました。 (Álvaro Herrera, Robert Haas, Thomas Munro)
ある使用パターンでは、既存の周回対策が不十分で、pg_multixact/members
ファイルの早すぎる削除がありえ、結果としてデータ損失になりました。
これに対する修正では、古いマルチトランザクションメンバIDデータを上書きする結果になるトランザクションを失敗させるようにサーバを変更し、トランザクションID周回を防止するのと同様に確実にマルチトランザクションメンバID周回を防ぐ動作をするようにautovacuumを改良しました。
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()
関数を使った全てのビューやルールを削除して再作成する必要があることに注意してください。
json
への変換で無限大の日付やタイムスタンプをエラーを投げるのでなくinfinity
にします。
(Andrew Dunstan)
json
/jsonb
のpopulate_record()
およびto_record()
関数が空の入力を適切に扱うように修正しました。
(Andrew Dunstan)
HOT更新後の遅延排他制約の誤った検査を修正しました。 (Tom Lane)
遅延排他制約に違反する可能性のある新しい行が同じトランザクションで後でHOT更新された(インデックスが付かない列の更新でその行が同テーブルページ内に格納できた)場合、後に削除される行が、新たな行と当初に衝突していた場合でも、排他制約は最後に行われる検査で違反を報告することがありました。
ALTER TABLE ... ALTER CONSTRAINT
で外部キー制約の遅延可能状態を変更するときの振る舞いを修正しました。
(Tom Lane)
同セッションでの続く操作や同時実行セッションでの操作で、状態変更を即座に反映しないことがありました。
スタースキーマ風の問い合わせのプラン作成を修正しました。 (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」(全てのリレーションを一緒に結合するのに失敗しました)を導くのが見かけられ、また、そのほかの場合でも起きるようです。
UPDATE
またはDELETE
の対象がセキュリティバリアビューであるとき、適切に行ロックが生じることを確実にしました。
(Stephen Frost)
PostgreSQL起動時にレプリケーションスロットのデータを同期するとき、ファイルを read/write で開くようにしました。 (Andres Freund)
一部のプラットフォームにおいて、これまでの実装では「could not fsync file "pg_replslot/...": Bad file descriptor」のようなエラーが生じることがありました。
max_prepared_transactions
が小さすぎるとき、PostgreSQL起動時にデッドロックの可能性があり、修正しました。
(Heikki Linnakangas)
タイムライン切り替え後、使えない事前割り当てされたWALファイルをアーカイブしないようにしました。 (Heikki Linnakangas)
クラッシュ後に再帰的にfsync()
を行うようにしました。
(Abhijit Menon-Sen, Robert Haas)
これにより別のクラッシュがすぐ後に生じた場合でも一貫性を確実にします。 (問題となるのは二番目のクラッシュが単なるデータベースクラッシュではなくシステムレベルのクラッシュである場合です。)
SIGTERMシグナルを受け取った後にエラーが起きた場合に、autovacuumランチャープロセスがシャットダウンに失敗する可能性があったのを修正しました。 (Álvaro Herrera)
セッション開始初期のシステムカタログに対する無効化メッセージの扱いを修正しました。 (Tom Lane)
この誤りは同時に開始するシステムカタログのVACUUM FULL
をするセッションで失敗をひき起こすことがありました。
BackendIdGetTransactionIds()
でちょうど終了したバックエンドプロセスの状態取得を試みたときのクラッシュを修正しました。
(Tom Lane)
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を書くトランザクションのコミットにて遅延がおきる可能性があり、全スタンバイがダウンしている場合には、セッションが開始時に固まってしまうなどの望ましくない結果に至りました。 同期レプリケーションのときのキャッチアップ割り込み処理でもセッションが固まることがありました。 本修正はこれらの問題を解消します。
recovery_min_apply_delay
に短い時間が設定されているときのビジーウェイトを回避します。
(Andres Freund)
一時テーブル上のハッシュインデックスを操作するときに生じるクラッシュを修正しました。 (Heikki Linnakangas)
他プロセスが同時にインデックスを変更している場合、ハッシュインデックスのバケツ分割に失敗する可能性があり、修正しました。 (Tom Lane)
GINインデックスのVACUUMにおけるメモリリークを修正しました。 (Heikki Linnakangas)
インデックス式のANALYZE中に割り込みを検査するようにしました。 (Jeff Janes)
ANALYZE
ではインデックスの式を何度も実行します。
こういった式の中に遅い関数があった場合、ANALYZE
をループが終わる前にキャンセルできることが望まれます。
SELECT FOR UPDATE
、UPDATE
、または、DELETE
での行ロック後にREAD COMMITTED
再チェックが生じたときに、外部テーブルのtableoid
が確実に正しく報告されるようにしました。
(Etsuro Fujita)
外部サーバユーザマッピングのオブジェクト説明文字列にターゲットサーバ名を追加しました。 (Álvaro Herrera)
符号化方式変換むけのオブジェクト識別文字列にスキーマ名を含めました。 (Á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
項目の現在の意味に対する、微妙で潜在的にセキュリティ影響のある変更に向かい、これはマイナーリリースで行うこととして良いことではありません)。
実際には起動しなかったバックグラウンドワーカが終了したときの状態報告を修正しました。 (Robert Haas)
データベースクラッシュ後、BGW_NEVER_RESTART
が指定されているバックグラウンドワーカは再起動しないようにしました。
(Amit Khandekar)
レプリケーションコマンド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)
この誤りで、外部キー制約が一時的に違反になるために再ロードできないダンプを作ってしまう可能性がありました。
同時実行セッションで一時的な関数の作成と削除をしている場合にpg_dumpが失敗する可能性があり、防止しました。 (Tom Lane)
VALUES (...) だけであるけれどカラム別名を持つビューのダンプについて修正しました。 (Tom Lane)
ダンプ/リストアでビューのレプリケーション識別が確実に正しくnothing
に設定されるように修正しました。
(Marko Tiikkaja)
これまでは、ビューが循環依存を伴う場合、レプリケーション識別属性がおかしくなることがありました。
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)
contrib/intarray
で遅いソートアルゴリズムを修正しました。
(Tom Lane)
Sparc V8 マシンでのコンパイル失敗を修正しました。 (Rob Rowan)
macOS での一部のビルド警告を黙らせました。 (Tom Lane)
タイムゾーンデータファイルが、エジプト、モンゴル、パレスチナにおける夏時間規則の変更、カナダ、チリの歴史的変更、America/Adak の時間帯省略形の改定(HAST/HADT でなく HST/HDT となる)が含まれるtzdata release 2015d に更新されました。