リリース日: 2020-08-13
このリリースは12.3に対し、様々な不具合を修正したものです。 12メジャーリリースにおける新機能については、E.5を参照してください。
ロジカルレプリケーションのwalsenderと適用ワーカーに安全なsearch_path
を設定するようにしました。
(Noah Misch)
パブリッシャーかサブスクライバーのデータベースの悪意のユーザが、しばしばスーパーユーザであるレプリケーション実行ユーザで、潜在的に任意SQLコード実行を引き起こせる可能性がありました。
この危険性の一部は、CVE-2018-1058で説明されているものと同じで、レプリケーション送信者と受信者の空のsearch_path
での実行を保証する本修正により軽減されます。
(CVE-2018-1058と同様に、この変更はレプリケーションされているテーブルのDDLにおける修飾されていない名前について問題を引き起こすかもしれません。)
他の危険性は信頼できないロールに属するオブジェクトのレプリケーションに固有のものです。私たちができうる最大のことは考慮すべき危険性があることのドキュメント記載です。
(CVE-2020-14349)
contribモジュールのインストールスクリプトをより安全にしました。 (Tom Lane)
拡張のターゲットスキーマか拡張が必要とするスキーマに攻撃者がオブジェクトを作成できる場合にCVE-2018-1058で説明されているものと似た攻撃が拡張のインストールスクリプトに対して行われる可能性がありました。
拡張はしばしばインストールにスーパーユーザ権限を必要とするため、これはスーパーユーザ権限を奪取する道を開くことができます。
この危険性を軽減するため、インストールスクリプトの実行で使われるsearch_path
についてより注意深くし、スクリプト内でcheck_function_bodies
を無効化し、さらに、いくつかのcontribモジュールで使われるカタログ調整の問い合わせを安全になるように修正しました。
これは完全な解決策ではありません。不注意にインストールされた場合、他の拡張に依存する拡張は依然として危険です。
(CVE-2020-14350)
パーティション除去で限界値の場合について修正しました。 (Etsuro Fujita, Dmitry Dolgov)
複数のパーティションキー列が存在するとき、一部の列が限定するWHERE
句を持たなかったり、複数の限定句を持つ場合に、除去検査の生成が誤動作する可能性がありました。
これにより、サーバクラッシュや誤った問い合わせ結果、あるいは、アサート失敗がもたらされる可能性がありました。
パーティション毎の入れ子ループ結合の内側における、パラメータ付きのBitmapAndとBitmapOrのインデックススキャンの構築を修正しました。 (Tom Lane)
このような結合の外側からの値を必要とするスキャンでのプランは、実行時にたいていクラッシュを引き起こしました。
パーティションテーブルが同じ問い合わせで静的パーティション除外と実行時パーティション除外の両方の対象となる場合であって、新たなパーティションがその問い合わせと同時に追加されたときの、不正なプラン実行を修正しました。 (Amit Langote, Tom Lane)
ロジカルレプリケーションのwalsenderで、キープアライブメッセージ送信後のフィードバックメッセージ送信の失敗を修正しました。 (Álvaro Herrera)
組み込みのwalreceiverはいずれにせよ(誤った状態を解消する)フィードバック返信をかなり高頻度で送るため、組み込みのロジカルレプリケーションを使っている場合はこれは相対的に小さな問題です。 しかし、pglogicalのような一部の他のレプリケーションシステムでは、重大な性能問題を引き起こします。
ロジカルレプリケーションのサブスクライバーで列指定UPDATE
トリガーの起動を修正しました。
(Tom Lane)
このコードではパブリッシャ―とサブスクライバ―のテーブル間で列数が異なる可能性に対して考慮を怠っていて、実際に異なっていた場合、どのトリガを起動するかについて誤った判断をするかもしれませんでした。
pg_replication_slot_advance()
実行時に最も古いxmin値とLSN値を更新するようにしました。
(Michael Paquier)
これまで本関数はこれを実行できておらず、レプリケーションスロットの手動前進の後にリソースのクリーンアップ(不要となったWALセグメントの削除など)を妨げるかもしれませんでした。
ts_headline()
の低速な実行を修正しました。
(Tom Lane)
以前のマイナーリリースで加えられた複数のフレーズ検索の修正が、長い文章に対してts_headline()
に不合理に大きな時間をとらせる可能性があり、更に悪いことに、問い合わせは手数のかかるループ内でキャンセルできませんでした。
repeat()
関数が問い合わせのキャンセルで確実に中断できるようにしました。
(Joe Conway)
Windowsにおいてpg_current_logfile()
が結果に復帰(\r
)を含めないように修正しました。
(Tom Lane)
pg_read_file()
と関連する関数がEOFに達するまで読むことを保証しました。
(Joe Conway)
これまでは読み取るデータ長が明示されていない場合、stat()
で報告されたファイル長で何であれ停止していました。
この動作はパイプや他の種類の仮想ファイルに対しては役に立ちません。
jsonpath
の計算で数値のNaN
を禁止しました。
(Alexander Korotkov)
SQLにもJSONにもNaN
(not-a-number、非数)という概念はありませんが、jsonpath
のコードはこのような値をそれでも受け付けようと試みていました。
これは必然的に非標準の動作をもたらすため、このような値は最初から拒絶するのが良いと思われます。
浮動小数点の集約で単一のInf
やNaN
の入力を正しく扱うようにしました。
(Tom Lane)
影響を受ける集約は、corr()
、covar_pop()
、regr_intercept()
、regr_r2()
、regr_slope()
、regr_sxx()
、regr_sxy()
、regr_syy()
、stddev_pop()
、および、var_pop()
です。
このような場合の正しい答えはNaN
ですが、PostgreSQL v12で導入されたアルゴリズム変更のために、これらの集約が代わりにゼロを返すようになっていました。
並列集約時のnumeric
型の列におけるNaN
入力の誤った処理を修正しました。
(Tom Lane)
一部の部分集約ワーカーがNaN
だけを見つけ、一方で他のワーカーは非NaN
だけを見つけた場合、誤った全体結果(すなわち、NaN
であるべきときにNaN
でない)をもたらす可能性がありました。
24時間を超える時刻を拒絶するようにしました。 (Tom Lane)
日付時刻入力のコードの意図は「24:00:00」や等価の「23:59:60」を許容することであって、より大きい値は許しません。
しかしながら、ゼロでない小数秒nnn
を伴う「23:59:60.nnn
」を受け付けてしまうように、範囲検査が誤って実装されていました。
timestampの値では、これは翌日の最初の秒に折り返される結果になりました。
time
とtimetz
の値では、格納された値が実際に24時間より大きくなり、ダンプ/リロードの失敗と場合によっては他の誤動作を引き起こしました。
EXPLAIN
のテキスト以外の出力形式でインデックス名のダブルクォート付けを戻すようにしました。
(Tom Lane, Euler Taveira)
Gather Merge
ノードを使うプランのパラレルワーカーでEXPLAIN
のリソース使用について、とりわけバッファアクセスについて、計算を修正しました。
(Jehan-Guillaume de Rorthais)
ALTER TABLE
で制約の再検証のタイミングを修正しました。
(David Rowley)
ALTER TABLE
が(例えば列のデータ型を変更するために)テーブル内容を完全に書き直す必要があり、また、外部キーやCHECK
制約を再検証するためテーブルをスキャンする必要がある場合、しばしば誤った順序で実行していて、「could not read block 0 in file "base/nnnnn/nnnnn": read only 0 of 8192 bytes(ファイルbase/nnnnn/nnnnnのブロック0が読めません)」といった奇妙なエラーをもたらしました。
REINDEX CONCURRENTLY
がインデックスのレプリケーションアイデンティティのフラグを維持するように修正しました。
(Michael Paquier)
これまでは、テーブルのレプリカアイデンティティのインデックスを再構築すると設定が失われ、将来の論理デコード出力に古いタプル値が含まれなくなる原因となっていました。
pg_subscription
.subslotname
とpg_subscription_rel
.srsublsn
に対する不正確な非NULLの印付けを回避しました。
(Tom Lane)
ブートストラップカタログデータはこれら二つのカタログ列を誤って常に非NULLと印付けします。
(v13以降は正しい印付けになりますが)既存のインストレーションでこの誤りを正す簡単な方法がありません。
この印付けに依存する主な場所はJIT有効時のタプル分解で、そのため、これら2列に対する印付けを明示的に無視させるようにしました。
また、NULLであるかの検査無しにsrsublsn
にアクセスしていたCコードを修正しました。
これによるクラッシュは無さそうですが、おそらく不可能ではありません。
FROM
句で平坦化されていない副SELECT
に付加された条件句のLATERAL
参照をうまく処理するようにしました。
(Tom Lane)
この見落としにより、問い合わせの実行でアサート失敗やクラッシュを引き起こす可能性がありました。
選択率の見積もりで実行された演算子に対して問い合わせで指定した照合順序を使用するようにしました。 (Tom Lane)
これまでは、データベースの列に基づく照合順序が使われていました。 しかし、問い合わせの照合順序を使う方が間違いなく適正です。 さらに重要なことには、現在は非決定的照合順序があるため、非決定的照合順序が演算子に与えられた際に完全に失敗する場合があります。 問い合わせ自体が動作するであろうときにプラン作成が失敗するのは望まれないため、このことは、見積用の演算子の実行には問い合わせの照合順序を使わなければならないことを意味します。
一度もアナライズされていない外部テーブルを0行であると思わないようにしました。 (Tom Lane)
これは主にプランナのGROUP BY
で得られるグループ数の見積もりに影響しました。
BRINインデックスの非サマリー化で間違った「leftover placeholder tuple(残余のプレースホルダタプル)」に関する警告を除きました。 (Álvaro Herrera)
キャンセルされたバキュームの後に正常動作で生じることがありうるため、これに関する警告は過剰なノイズです。
「共有ファイルセット」一時ファイルに対するテーブル空間の選択を修正しました。 (Magnus Hagander, Tom Lane)
temp_tablespaces
が空あるいは明示的にデータベースの主テーブル空間が指定された場合に、このファイルは予期されるデータベースの主テーブル空間ではなく、pg_default
テーブル空間に置かれました。
WAL整合性検査時のSP-GiSTインデックスページのマスキングにおいて稀な場合のエラーが修正されました。 (Alexander Korotkov)
これはwal_consistency_checking
が有効のときに偽の失敗を報告する可能性がありました。
サーバのbuffile
モジュールでのエラー処理を改善しました。
(Thomas Munro)
I/OエラーがEOFに達したのと区別できなかったり、全く報告されなかった、いくつかの場合について修正しました。 また、適切な個所にブロック番号とバイト数などの詳細を加えました。
SERIALIZABLE
隔離モードで衝突検査の異常を修正しました。
(Peter Geoghegan)
同時挿入されたタプルが異なる並行するトランザクションから更新されて、かつ、どちらのタプルバージョンも現在トランザクションのスナップショットから不可視の場合、直列化の衝突検査がどちらのタプルが現在トランザクションの結果に関連するかについて誤った結論を選ぶ可能性がありました。 これによりシリアライザブルトランザクションが直列化エラーで失敗すべきときにコミットできてしまうおそれがありました。
Bツリーインデックスのデッドのエントリを繰り返しデッドと印付けするのを回避しました。 (Masahiko Sawada)
機能的には無害ですが、これは、チェックサムが有効、または、wal_log_hints
がonのときに無駄なWALトラフィックをもたらしました。
checkpointerプロセスをfsync
がoffのときにはファイル同期要求を捨てるように修正しました。
(Heikki Linnakangas)
このような要求はfsync
がoffなら、何もしないものとして処理されますが、checkpointerのペンディングアクションテーブルから取り除くのを忘れていました。
これは、このテーブルの肥大化を招き、fsync
が後に再び有効化された場合にはアサート失敗をもたらす可能性もありました。
バックアップ中にJITコンパイルが有効化されていたときの、非排他的なバックアップのクリーンアップ中の問題を回避しました。 (Robert Haas)
pg_control
を変更する前に正しいロックを取得するように一部のコードパスの障害を修正しました。
(Nathan Bossart, Fujii Masao)
この手落ちのため、pg_control
に一致しないチェックサムで書き出されてしまう可能性があり、次のpg_control
更新の前にクラッシュした際にデータベースを再起動できないことを含め、場合によっては後で問題を起こしました。
currtid()
とcurrtid2()
でエラーを修正しました。
(Michael Paquier)
これらの(文書化されておらずとても古いバージョンのODBCドライバでのみ使われる)関数にはクラッシュや、ストレージを持たないリレーションに適用するときの「could not open file(ファイルが開けません)」といった混乱したエラーメッセージをもたらすコーディングの誤りが含まれていました。
スピンロックを持っているときにelog()
やpalloc()
の呼び出しを回避しました。
(Michael Paquier, Tom Lane)
レプリケーションスロットに関するロジックには、このコーディングルール違反がいくつかありました。 問題となる可能性は非常に低いですが、この呼ばれた関数内でのエラーはスピンロックのスタックをもたらすでしょう。
ロジカルレプリケーションのサブスクライバでREPLICA IDENTITY FULL
が使用できるようにアサートを修正しました。
(Euler Taveira)
これは誤ったアサートというだけであって、標準の実運用ビルドでの影響はありません。
libpqが書き込み失敗後にデータベース接続のソケットから読み取りを試行し続けることを保証しました。 (Tom Lane)
これはダウンしたサーバプロセスから全ての最終エラーメッセージを確実に収集することのみならず、読み取り失敗に遭遇するまで接続の喪失を認識しないことからも重要です。
この見落としにより、libpqが転送中の接続喪失の後に、アプリケーションに失敗を報告することなく、COPY
データを無制限に送信しようとし続けることがあり得ました。
libpqのGSS暗号化状態の管理でバグを修正しました。 (Tom Lane)
GSS暗号化を使った接続はサーバ再起動後に接続のリセットを試みた際や候補サーバリストの次に移ったときにフリーズする可能性がありました。
bytea
とカーソル変数でのecpgのクラッシュを修正しました。
(Jehan-Guillaume de Rorthais)
pg_dumpとpg_basebackupでディスク容量不足のエラーを適切に報告するようにしました。 (Justin Pryzby, Tom Lane, Álvaro Herrera)
一部のコードパスは「could not write file: Success(ファイルに書き込めません:成功)」のような、ばかげた報告を出す可能性がありました。
pg_restoreが順番通りでないデータ要素をリストアする必要があるときにデータオフセットの無いカスタム形式のアーカイブファイルを処理できるようにしました。 (David Gilman, Tom Lane)
pg_dumpは出力を走査できない場合(例えば、出力が何かにパイプされていた場合)に、このようなファイルを生成します。 本修正は主にこのようなファイルから並列リストアを実行できるように改善します。
テーブル単位権限と列単位権限の両方を持つテーブルの並列リストアを修正しました。 (Tom Lane)
テーブル単位権限が最初に付与されている必要がありますが、並列リストアは確実にはその順番で実行されませんでした。 これにより、「tuple concurrently updated(タプルが同時に更新されました)」エラーや、列単位権限の付与の一部消失がもたらされる可能性がありました。 これに対する修正はアーカイブファイルでこのような要素の間の依存性のリンクを含めることで、本問題が再発しないためには修正されたpg_dumpで新たなダンプを取る必要があることを意味します。
pg_upgradeがターゲットクラスタでvacuum_defer_cleanup_age
をゼロにして実行するようにしました。
(Bruce Momjian)
ターゲットクラスタの設定でvacuum_defer_cleanup_age
が非ゼロ値に修正されていた場合、システムカタログの凍結が適切に動作せず、混乱させるようにアップグレードの失敗を引き起こしました。
そのような設定はアップグレードの間、上書きされるようにしました。
pg_recvlogicalを終了前に未処理メッセージを捨てるように修正しました。 (Noah Misch)
これを行わないと、レプリケーション送信者が送出失敗を検出して、レプリケーションスロットのLSN位置への予期される最終更新の印付けなしに終了するかもしれません。 これは次の接続後にデータの再送出をもたらしました。 また、pg_recvlogicalが消費したい最後のデータの後に送られたエラーメッセージを取りこぼす可能性もありました。
pg_rewindのソースデータディレクトリで単に削除されたファイルの処理を修正しました。 (Justin Pryzby, Michael Paquier)
オンラインソースデータベースで動作しているとき、同時のファイル削除が可能でしたが、pg_rewindは、ファイルのディレクトリエントリの走査とstat()
による検査との間に削除が生じた場合に混乱していました。
Windowsでpg_test_fsyncがバイナリI/Oモードを使うようにしました。 (Michael Paquier)
これまではテストファイルをテキストモードで書いていました。これはPostgreSQLの実際の使用法の正確な投影ではありません。
contrib/amcheck
を削除された空のインデックスページについてエラーを出力しないように修正しました。
(Alexander Korotkov)
この状態はWALリプレイ中では正常です。
contrib/dblink
でローカル状態を正しく初期化しない障害を修正しました。
(Joe Conway)
正当な状況の組み合わせで、dblink_close()
が予期せぬリモートのCOMMIT
を発行する可能性がありました。
contrib/pgcrypto
のdeflate()
の誤使用を修正しました。
(Tom Lane)
pgp_sym_encrypt
関数は、zlib APIの要件を誤って扱っていたため、不正な圧縮データを生成する可能性がありました。
標準的なzlibでこのエラーを示す報告はありませんが、IBMのzlibNX実装を使うときに確認されています。
contrib/pgcrypto
のpgp_sym_decrypt
関数における圧縮の展開ロジックで稀な場合の不具合を修正しました。
(Kyotaro Horiguchi, Michael Paquier)
圧縮されたストリームは空のパケットで正当に終了する可能性がありますが、展開ロジックがこれを扱えず、破損データに関してエラーが出ていました。
Microsoft Visual Studio 2015以降でNLSコードのビルドに対応しました。 (Juan José Santamaría Flecha, Davinder Singh, Amit Kapila)
ソースコードツリー上のいくつかの階層にconfigure
という名前のファイルがあるときに起こりうるMSVCインストールスクリプトの失敗を回避しました。
(Arnold Müller)
これは、ソースツリーの最上位階層を識別するためにconfigure
を探している一部のロジックを混乱させる可能性がありました。