リリース日: 2019-05-09
このリリースは11.2に対し、様々な不具合を修正したものです。 11メジャーリリースにおける新機能については、E.5を参照してください。
行単位セキュリティポリシーが選択率の見積処理を通して回避されてしまうのを防止しました。 (Dean Rasheed)
一部のプランナの選択率見積処理はユーザ定義演算子をpg_statistic
から得た値に適用します。
それゆえ漏洩のある演算子により、呼び出すユーザに列を読む権限が無くとも、データ列要素の一部が漏洩する可能性があります。
CVE-2017-7484ではこれを未然に防ぐ対処をしましたが、行単位セキュリティの影響を考慮していませんでした。
列を読むSQL権限を持つけれどRLSポリシーによりいくつかの行の参照は禁じられているユーザが、漏洩のある演算子を通してこれら行内容について何らかを知るかもしれませんでした。
本修正はルールをより厳しくして、漏洩のある演算子は関連するRLSポリシーが無いときだけ統計データに適用できるようにします。
(CVE-2019-10130)
パーティション振り分けのエラー報告時の解放済みメモリの使用を回避しました。 (Michael Paquier)
この誤りはクラッシュをもたらし、また、原理的にはサーバメモリ内容を露出させるのに使われる可能性があります。 (CVE-2019-10129)
パーティションテーブルに対するALTER TABLE
がパーティションインデックスが再利用可能と判断した場合のカタログ破損を回避しました。
(Amit Langote, Tom Lane)
例えばALTER COLUMN TYPE
が物理テーブルの書き換えが必要ないと判断した場合に発生します。
単一文のトランザクションでON COMMIT DROP
と識別列を伴う一時テーブルが作られたときのカタログ破損を回避しました。
(Peter Eisentraut)
一時テーブルは作成後すぐに削除されますので本ケースは実際には役に立たず、そのため本障害は見逃されました。
パーティションテーブルが属するパーティションよりも削除された列を多く含む場合における、ALTER INDEX ... ATTACH PARTITION
でのエラー発生を修正しました。
(Álvaro Herrera)
一部の場合でパーティションの既存インデックスを新たに作成されたパーティションインデックスに付加するのに失敗するのを修正しました。 (Amit Langote, Álvaro Herrera)
これは続くこのパーティションインデックスを使うDDLで「index ... not found in partition(インデックス...がパーティションに見つかりません)」のようなエラーをもたらします。
パーティション問い合わせの結果リレーションに対してEPQ再チェックが実行されたときのクラッシュを回避しました。 (Amit Langote)
これは、READ COMMITTED
隔離レベルを使っていて他のセッションが同時に対象行の一部を更新しているときに発生します。
削除された列を持つ複数階層のパーティションテーブルでのタプル振り分けを修正しました。 (Amit Langote, Michael Paquier)
外部キー制約の初期検証の遅い処理パスがパーティションテーブルに適用されたときのエラーを修正しました。 (Hadi Moshayedi, Tom Lane, Andres Freund)
これは(権限の問題などで)速い処理パスが使われないという稀な場合を除いて、出現しません。
全てのテーブルを除外できる継承ツリーやパーティションテーブルへのUPDATE
やDELETE
の振る舞いを修正しました。
(Amit Langote, Tom Lane)
このような場合、RETURNING
があるときに問い合わせが正しい出力列集合を報告せず、発動すべき文単位トリガがあるときにそれが発動しませんでした。
constraint_exclusion
がon
に設定されていてパーティションディレクトリにアクセスするとき、パーティションのパーティション制約を排他検査におけるCHECK
制約と同様に使用するようにしました。
(Amit Langote, Tom Lane)
この変更は振る舞いをバージョン10のものに戻します。
トランザクションコミットをまたがるカーソル問い合わせを永続化しようとする間にエラーが発生したときのサーバクラッシュを回避しました。 (Tom Lane)
プロシージャが明示的または暗黙的なカーソル(例えばPL/pgSQLのFOR
ループ問い合わせ)をオープンしている間にコミットしようとした場合、そのカーソルは完全に実施されなければならず、トランザクションコミットが行われる前に保存されたその結果が使用可能になります。
このような処理の際に起きるエラーがクラッシュをもたらしました。
FOR ALL TABLES
のパブリケーションが在るときに、一時テーブルとログを取らないテーブルの更新に対して誤ったエラーが投げられるのを回避しました。
(Peter Eisentraut)
このようなテーブルはパブリケーションの対象として無視されるべきですが、いくらかのコード箇所ではそのようになっていませんでした。
対象リレーションが更新可能ビューである場合に、複数のVALUES
行を伴うINSERT ... VALUES
コマンドでの明示的なDEFAULT
要素の処理を修正しました。
(Amit Langote, Dean Rasheed)
更新可能ビューは列にデフォルトを持たないけれども、元となるテーブルにはあるとき、単一行のINSERT ... VALUES
は元となるテーブルのデフォルトを使用します。
しかしながら、複数行の場合には、常にNULLが使われました。
これを単一行の場合と同様に動作するように修正しました。
CREATE VIEW
をゼロ列のビューを許容するように修正しました。
(Ashutosh Sharma)
ゼロ列のテーブルを許容していることとの一貫性のため、私たちはこれを許容すべきです。 テーブルはビューに転換される可能性があるので、制限があっても代わりにゼロ列ビューが作られて、ダンプ/リストアの失敗をひき起こす可能性がありました。
欠けていたCREATE TABLE IF NOT EXISTS ... AS EXECUTE ...
のサポートが追加されていた。
(Andreas Karlsson)
IF NOT EXISTS
とEXECUTE
の組み合わせは動作すべきですが、文法で省かれていました。
行単位セキュリティポリシーの式にあらわれる副SELECT
が正しいユーザの権限で実行されることを保証しました。
(Dean Rasheed)
これまでは、RLSポリシーを持つテーブルがビューを通してアクセスされた場合、その検査が本来そうあるべきビュー所有者としてではなく、ビューを呼び出したユーザとして実行されるかもしれませんでした。
SQL:2006以降の要求により、xmloption
がcontent
に設定されているとき、XMLドキュメントをxml
型の有効な値として受け入れるようにしました。
(Chapman Flack)
これまではPostgreSQLは、これを許さないSQL:2003の定義に従っていました。
しかし、これによりダンプ/リストアに、全ての有効なXMLデータを受け付けるxmloption
の設定が無いという重大な問題が生じます。
そこで、2006の定義に切り替えました。
さらにpg_dumpはデータのリストアに際してSET xmloption = content
を出力するように変更され、有力な設定がdocument
であってもダンプ/リストアが機能することを保証します。
サーバの起動時の、既存の共有メモリセグメントが未だ使われているかどうかの検査を改善しました。 (Noah Misch)
postmasterは、たとえpostmaster.pid
ファイルが削除されていても、未だ動作中の以前のpostmasterで生じたプロセスがあることをより良く検出するようになりました。
btreeインデックスのバキュームのロジックでゼロ除算の可能性があり、回避しました。 (Piotr Stefaniak, Alexander Korotkov)
これはインデックスのクリーンアップが必要かどうかについて誤った判断をもたらします。
パラレルワーカのトランザクションを別トランザクションとして数えるのを回避しました。 (Haribabu Kommi)
GINインデックスのWALレコードの非互換性を修正しました。 (Alexander Korotkov)
2月のマイナーリリースで適用された修正は後方互換性に十分な注意が払われておらず、そのリリースのスタンバイサーバがより以前のマイナーリリースのプライマリサーバで生成されたGINページ削除のWALレコードを読む場合に問題をもたらしました。
レプリケーション接続でSHOW
コマンド実行中にクラッシュの可能性があり、修正されました。
(Michael Paquier)
ポータルから一件ずつ行を取り出すときのサーバのメモリリークを回避しました。 (Tom Lane)
パーティションのリレーションキャッシュの項目が再構築されるときのメモリリークを回避しました。 (Amit Langote, Tom Lane)
適切な場所において、fsync
とsync_file_range
の呼び出しに対して、EINVAL
とENOSYS
のエラー結果に寛容に扱うようにしました。
(Thomas Munro, James Sewell)
以前のファイル同期の失敗をパニックとする変更は、失敗が想定できて本質的に「操作がサポートされない」といういくつかの場合において過度に偏執的であることがわかりました。
BRINの要約操作の時にautovacuumのpg_stat_activity
が正しいリレーション名を報告するようにしました。
(Álvaro Herrera)
GEQOが有効なときにパーティションに関する結合プランの作成を試みたときのクラッシュを回避しました。 (Tom Lane)
FULL
外部結合の中から外に導くラテラル参照での「failed to build any N
-way joins(N-way結合の構成に失敗しました)」というプランナのエラーを修正しました。
(Tom Lane)
集合を返す関数が空といえるリレーションに適用される問い合わせにおけるプラン作成の誤りを修正しました。 (Tom Lane, Julien Rouhaud)
v10では、この見過ごしは僅かに効率的でないプランを導くだけですが、v11 では「set-valued function called in context that cannot accept a set(集合値の関数が集合を受け付けない文脈で呼ばれました)」のエラーをひき起こします。
漏洩のある演算子にpg_statistic
のデータを参照させる場合の規則を強制するときに、適切なユーザ権限を検査するようにしました。
(Dean Rasheed)
基となるテーブルがビューを通してアクセスされているとき、漏洩のある演算子をテーブルの統計データに適用するかどうかの判断に、問い合わせを実行したユーザの権限ではなくビュー所有者の権限を考慮します。 これにより、プランナのどのデータが可視かに関する規則をエグゼキュータのものと一致させて、無駄に劣ったプランを回避します。
グループ化問い合わせに対するプランナのパラレル安全の検査を修正しました。 (Etsuro Fujita)
これまでは、並列化されていた可能性のある対象リストの検査動作が無いかもしれませんでした。
プランナの一意性インデックスのロジックで、「含められた」インデックス列の処理を修正しました。 (Tom Lane)
これにより、含められた列を伴う一意性インデックスが問い合わせ結果の一意性を証明することを認識できない結果になる可能性がありました。
配列の強制式に対する誤った厳格性(STRICT)の検査を修正しました。 (Tom Lane)
これにより、例えば、誤ったSTRICTなSQL関数のインライン化を許してしまうかもしれず、厳格性の条件が強制されない結果をもたらしました。
多数の同値条件と多数の潜在的に関連する外部キー制約があるときのプラン作成を高速化しました。 (David Rowley)
多数のテーブルを作るトランザクションをロールバックする際にO(N^2)性能になる問題を回避しました。 (Tomas Vondra)
動的共有メモリの割り当てで稀な場合のサーバクラッシュを修正しました。 (Thomas Munro, Robert Haas)
動的共有メモリの制御での競合状態を修正しました。 (Thomas Munro)
これにより、「dsa_area could not attach to segment(dsa_areaがセグメントにアタッチできません)」や「cannot unpin a segment that is not pinned(ピンされていないセグメントをピン解除できません)」のエラーが生じる可能性がありました。
それによりシャットダウン要求を受け取った後にホットスタンバイpostmasterがシャットダウンに失敗する可能性のある競合状態を修正しました。 (Tom Lane)
pg_identify_object_as_address()
に無効な入力が与えられたときに起こりうるクラッシュを修正しました。
(Álvaro Herrera)
txid_status()
で起きる可能性のある「could not access status of transaction(トランザクションの状態にアクセスできません)」エラーを修正しました。
(Thomas Munro)
複数OpenSSLライブラリバージョンを混用してSCRAM認証を使おうとしたときの認証失敗を修正しました。 (Michael Paquier, Peter Eisentraut)
libpqがOpenSSL 1.0.1以前を使っていて、サーバがOpenSSL 1.0.2以降を使っているとき、どのSASLメカニズムを使うかのネゴシエーションに失敗して、混乱させる「channel binding not supported by this build(このビルドではチャンネルバインディングはサポートされません)」エラーメッセージをもたらしました。
エンコードされたSCRAM-SHA-256およびMD5パスワードの検証を厳格にしました。 (Jonathan Katz)
一致する先頭の文字列を持つパスワード文字列がSCRAM-SHA-256やMD5形式で適切にハッシュ化されたものと誤認される可能性がありました。 パスワードは受け入れられますが後で使うことができません。
データベースエンコーディングと異なるエンコーディングを暗示するlc_time
設定の処理を修正しました。
(Juan José Santamaría Flecha, Tom Lane)
以前は、そのようなロケールで非ASCII文字を含むローカライズされた月と日の名前が予期せぬエラーや誤った出力をひき起こしていました。
current_logfiles
ファイルをサーバのデータディレクトリの他のファイルと同じパーミッションで作成するようにしました。
(Haribabu Kommi)
これまではlog_file_mode
で指定されたパーミッションが使われましたが、これはバックアップユーティリティで問題を起こすおそれがあります。
単項マイナス演算子に関する誤ったoperator_precedence_warning
の検査を修正しました。
(Rikard Falkeborn)
浮動小数点のサーバ設定値としてNaN
を禁止しました。
(Tom Lane)
pg_class
の個々のインデックスを再構築するときにアサート失敗を回避するようにREINDEX
処理を再調整しました。
(Andres Freund, Tom Lane)
プランナのパラメータ化されたダミーパスに対するアサート失敗を修正しました。 (Tom Lane)
SnapBuildInitialSnapshot()
の結果に正しいテスト関数を挿入するようにしました。
これはコアコードには無関係ですが、いくつかの拡張に影響します。
Windowsにおける断続的な「could not reattach to shared memory(共有メモリに再アタッチできません)」でのセッション開始失敗を修正しました。 (Noah Misch)
これまで認識されていなかった本障害の原因は、プロセスのデフォルトスレッドプールに対するスレッドのスタック作成です。 そのようなスタックが異なるメモリ領域に割り当てられるように調整しました。
Windowsにおけるディレクトリのスキャンでのエラー検出を修正しました。 (Konstantin Knizhnik)
ディレクトリを読むのに権限が不足してる、といったエラーが、検出されないか、あるいは正しく報告されず、そのかわりにディレクトリが空であるかのように黙って動作していました。
ecpgで文法の問題を修正しました。 (Tom Lane)
ecpgプログラムで、セミコロンの欠如がSET
(ただしvariable
= DEFAULTSET
ではない)の誤変換をもたらし、サーバが拒絶するであろう構文的に不正な出力を生成していました。
加えて、複数の型名を列挙するvariable
TO DEFAULTDROP TYPE
やDROP DOMAIN
コマンドで、最初の型名だけが実際に処理されました。
CREATE TABLE AS
に対するecpgの構文をサーバの構文と一致させました。
(Daisuke Higuchi)
ecpgのインクルードファイル名の処理で、起こりうるバッファオーバーランを修正しました。 (Liu Huailing, Fei Wu)
対象データディレクトリ内の一時ファイルの削除失敗によるpg_rewindのエラーを修正しました。 (Michael Paquier)
pg_verify_checksumsが指定されたデータディレクトリが正しいPostgreSQLバージョンのものであるかを確認するようにしました。 (Michael Paquier)
contrib/postgres_fdw
で、リモートのグルーピングまたは集約を使う問い合わせが、関連しない副SELECTや外部参照あるいはパラメータシンボルのSELECT
リスト要素を持つときのクラッシュを回避しました。
(Tom Lane)
振り分けられた行を挿入するのに選択されたリモートパーティションが、同コマンドにて後で更新されるUPDATE
サブプランの対象でもあるとき、エラーを報告するようにcontrib/postgres_fdw
を変更しました。
(Amit Langote, Etsuro Fujita)
これまでは、このような状況はサーバクラッシュやUPDATE
の不正な結果をもたらしていました。
このような場合に正しく動作できるようにすることは今後の課題です。
contrib/pg_prewarm
で、何らか理由でプレウォームに失敗した場合にバックグラウンドワーカプロセスを際限なく再作成しないようにしました。
(Mithun Cy)
contrib/vacuumlo
でlo_unlink()
呼び出しに失敗した場合のクラッシュを回避しました。
(Tom Lane)
タイムゾーンライブラリのコピーをIANA tzcode release 2019aに同期しました。 (Tom Lane)
これは、zicでのAfrica/Casablanca
ゾーンで誤った2440年の遷移を出力する小さなバグを直し、zicの新たな-r
オプションの対応を追加します。
タイムゾーンデータファイルをtzdata release 2019aに更新しました。パレスチナとメトラカトラの夏時間法の変更とイスラエルの歴史的な修正が含まれます。
Etc/UCT
は、現在では一般的にタイプミスとされる略記法UCT
を生成する別のゾーンである代わりに、後方互換性のあるEtc/UTC
へのリンクになりました。
PostgreSQLは未だUCT
を入力のゾーン略記法として受け入れますが、出力はしません。