リリース日: 2018-08-09
このリリースは10.4に対し、様々な不具合を修正したものです。 10メジャーリリースにおける新機能については、E.6を参照してください。
接続試行の間でlibpqの状態の完全リセットに失敗していたものを修正しました。 (Tom Lane)
dblink
やpostgres_fdw
の権限の無いユーザが、サーバ実行OSユーザが所有する~/.pgpass
ファイルなどのサーバ側認証情報を利用するのを防ぐ狙いの検査をすり抜けるおそれがありました。
ローカル接続上のpeer認証を許可しているサーバは特に攻撃されやすいです。
postgres_fdw
セッションに対するSQLインジェクションなどの他の攻撃も可能です。
この方法によるpostgres_fdw
への攻撃には指定の接続パラメータで外部サーバオブジェクトを作れることが必要ですが、dblink
に対してはアクセス可能な任意のユーザがこの問題を悪用できます。
他のありえそうな攻撃シナリオは考えにくいですが、一般にはlibpqを使ったアプリケーションに対して接続パラメータを指定できる攻撃者は悪さをすることが可能です。
この問題を報告したAndrew Krasichkovに感謝します。
(CVE-2018-10915)
単純なSELECT * FROM ...
でないビューへのINSERT ... ON CONFLICT UPDATE
を修正しました。
(Dean Rasheed, Amit Langote)
ビューのSELECT
リストが元テーブルの列と1対1対応していない場合、誤った更新可能ビューの展開がクラッシュや「attribute ... has the wrong type(属性...は誤ったデータ型です)」エラーをひき起こす可能性がありました。
さらに、このバグで攻撃者がテーブルにINSERT
権限と他のいくつかの列に対するUPDATE
権限を持つ場合に、対象列にUPDATE
権限が無くともその列の更新を可能にできるおそれがありました。
また、任意ユーザがサーバメモリを露出させるのにこの障害を利用できます。
(CVE-2018-10925)
「nailed」な(固定された)システムカタログに対するrelfrozenxid
値およびrelminmxid
値の更新が適時に処理されるようにしました。
(Andres Freund)
過度に楽観的なキャッシュ方式は、これらの更新が他のセッションから参照されることを妨げるおそれがあり、偽性のエラー、および/または、データ破損をひき起こしました。
古くなったキャッシュデータが既存セッションのみならず新たなセッションにまで持続する可能性があるため、この問題はpg_authid
などの共有カタログにおいて著しくより悪質です。
昇格したばかりのスタンバイがリカバリ後の最初のチェックポイントを完了する前にクラッシュする場合について修正しました。 (Michael Paquier, Kyotaro Horiguchi, Pavan Deolasee, Álvaro Herrera)
本障害により、続くWALをリプレイする際にサーバが一貫性をもったデータベース状態に到達していないと認識する状態になって、再起動を妨げました。
全てゼロのBツリーのページを再利用するときに、でたらめなWALレコードの出力を回避しました。 (Amit Kapila)
この誤りはアサート失敗としてあらわれました。また、潜在的にホットスタンバイサーバで不要な問い合わせキャンセルをひき起こす可能性がありました。
WALリプレイの際に1GBを超える長さの破損したレコードに対して保護しました。 (Michael Paquier)
このような場合に破損データとして扱います。 これまでは当該コードは空間を確保しようとして強いエラーになり、リカバリを不可能にしていました。
リカバリの最後にタイムラインヒストリファイルを書くのをできるだけ遅延しました。 (Heikki Linnakangas)
これにより(2相状態ファイルの問題などの)リカバリクリーンアップ中のエラーがディスク上に一貫性に欠けたタイムライン状態をもたらす状況を回避します。
多数のリレーションを削除するトランザクションに対するWALリプレイ性能を改善しました。 (Fujii Masao)
この変更は共有バッファをスキャンする回数を減らすので、共有バッファ設定が大きいときに最も恩恵があります。
スタンバイサーバのWALリプレイにてロック解放の性能を改善しました。 (Thomas Munro)
ロジカルWAL senderがストリーミング状態を正しく報告するようにしました。 (Simon Riggs, Sawada Masahiko)
これまでのコードは上流サーバに追いついているかどうかを誤判断していました。
ロジカルレプリケーションのサブスクライバでデータ型入力関数を実行するときにスナップショットが提供されるようにしました。 (Minh-Quan Tran, Álvaro Herrera)
この遺漏は、SQL言語の関数を使った制約を伴うドメインなど、幾つかの場合で障害をもたらしました。
ロジカルデコーディング中のスナップショット処理でのバグを修正しました。 稀な場合に誤ったデコーディング結果があり得ました。 (Arseny Sher, Álvaro Herrera)
ロジカルレプリケーションのテーブル同期ワーカにサブトランザクション処理を追加しました。 (Amit Khandekar, Robert Haas)
これまでは、同期されているテーブルを変更した後に何らかのサブトランザクションが中断された場合に、テーブル同期が誤動作するおそれがありました。
インデックス作成が途中で失敗した後に、テーブルのキャッシュされたインデックスリストが正しく再構築されるようにしました。 (Peter Geoghegan)
これまでは、失敗したインデックスのOIDがリストに残る可能性があり、同セッション内で後に問題をひき起こしました。
GINインデックスにおける空で圧縮されていないポスティングリストページの誤った処理を修正しました。 (Sivasubramanian Ramasubramanian, Alexander Korotkov)
この障害で、9.4より前のGINインデックスからのpg_upgrade後にアサート失敗をひき起こす可能性があります(9.4以降ではこのようなページを作りません)。
キャッシュライン共有を減らすため、無名POSIXセマフォの配列を埋めるようにしました。 (Thomas Munro)
これにより多CPUシステムでの競合を減らし、LinuxとFreeBSDでの(前リリースと比べての)性能退行を修正します。
パラレルインデックススキャンをするプロセスが確実にシグナル応答するようにしました。 (Amit Kapila)
これまではパラレルワーカはインデックスページ上のロックを待って詰まる可能性があり、問い合わせを中断する要求に気づきませんでした。
VACUUM
がBツリーページの削除ループの中で確実にシグナルに応答するようにしました。
(Andres Freund)
破損したBツリーインデックスはそこで無限ループする可能性があり、これまではクラッシュを強制する以外では割り込みができませんでした。
inner_unique最適化で入り込んだハッシュ結合のコスト計算の誤りを修正しました。
この最適化が適用可能な場合に悪いプラン選択をもたらす可能性があります。
複合型列に関する同値クラスの誤った最適化を修正しました。 (Tom Lane)
この障害により、複合列のインデックスがその列でのマージ結合に対してソート順を提供できることが認識できませんでした。
一部の集合を返す関数を伴う問い合わせで、「ORDER/GROUP BY expression not found in targetlist(ORDER/GROUP BYの式がターゲットリストに見つかりません)」エラーを回避するようにプランナを修正しました。 (Tom Lane)
配列などの、データ型に多態Bツリー演算子クラスを使っているパーティションキーの処理を修正しました。 (Amit Langote, Álvaro Herrera)
SQL標準のFETCH FIRST
構文を、標準で期待されている通り、パラメータ($
)が使えるように修正しました。
(Andrew Gierth)
n
重複するパーティションキー列に対するドキュメント化されていない制限を取り除きました。 (Yugo Nagata)
一時テーブルを非一時テーブルのパーティションとすることを禁止しました。 (Amit Langote, Michael Paquier)
以前には許されていましたが、この場合は信頼できる動作をしませんでした。
パラレルワーカでのEXPLAIN
の、特にバッファアクセスの、リソース使用集計を修正しました。
(Amit Kapila, Robert Haas)
SHOW ALL
をpg_read_all_settings
のメンバーであるロールに対して全ての設定を見せるように修正しました。
また、そのようなロールがpg_settings
ビューでソースファイル名と行番号を見ることができるようにしました。
(Laurenz Albe, Álvaro Herrera)
getObjectDescription
とgetObjectIdentity
の出力で、一部のオブジェクト名をスキーマ修飾するのに失敗していたものを修正しました。
(Kyotaro Horiguchi, Tom Lane)
照合順序、符号化方式変換、テキスト検索オブジェクト、パブリケーションリレーション、および、拡張統計オブジェクトの名前が、されるべきケースでスキーマ修飾されませんでした。
CREATE AGGREGATE
の型検査を並列動作をサポートする関数をvariadic集約に付与できるように修正しました。
(Alexey Bashtanov)
COPY FROM
の現在行番号カウンタを32ビットから64ビットに拡張しました。
(David Rowley)
これは4G行を超える入力に対して二つの問題を回避します。
COPY FROM WITH HEADER
が先頭行のみならず4G行毎に1行を捨ててしまっていました。
また、エラー報告が誤った行番号を示す可能性がありました。
シングルユーザモードでレプリケーションスロットを削除できるようにしました。 (Álvaro Herrera)
このユースケースはリリース10.0で偶然に壊されました。
パラレル集約モードで動作するときにvariance(int4)
と関連する集約から誤った結果が返るのを修正しました。
(David Rowley)
xmltable()
の列式でTEXT
およびCDATA
ノードを適切に処理するようにしました。
(Markus Winand)
起こりうるOpenSSLのRAND_bytes()
関数の失敗を適切に処理するようにしました。
(Dean Rasheed, Michael Paquier)
この誤りは、稀な状況で、postmasterを再起動することでしか解消できない「could not generate random cancel key(ランダムキャンセルキーを生成できませんでした)」エラーをひき起こす可能性がありました。
hostaddr
が指定された場合のいくつかのケースについてlibpqの処理を修正しました。
(Hari Babu, Tom Lane, Robert Haas)
いくつかの場合にPQhost()
は誤解を招く、あるいは、誤った結果を返しました。
これからは一律に、ホスト名が指定されていたならホスト名を、そうでなくホストアドレスだけが指定されていたならホストアドレスを、両パラメータとも省略されていたならデフォルトホスト名(典型的には/tmp
かlocalhost
)を返します。
また、SSL証明書を検証するときに誤った値がサーバ名と比較されるかもしれませんでした。
また、誤った値が~/.pgpass
のホスト名フィールドと比較されるかもしれませんでした。
これからは、そのフィールドはホスト名が指定されていたならホスト名と、そうでなくホストアドレスだけが指定されていたならホストアドレスと、両パラメータとも省略されていたならlocalhost
と、比較されます。
また、パース不能なhostaddr
値に対して不適当なエラーメッセージが報告されました。
また、これからはhost
、hostaddr
、または、port
パラメータがカンマ区切りリストを含むときに、libpqがリストの空要素をデフォルトの振る舞いを指定するものとして、より注意深く扱います。
ecpgのpgtypes
ライブラリに文字列解放関数を追加しました。
これにより、Windowsにおけるモジュールにまたがるメモリ管理の問題が回避できます。
(Takayuki Tsunakawa)
Windowsでは、与えられたメモリチャンクに対するfree
呼び出しがメモリをmalloc
した同じDLLから行われているのではない場合、クラッシュが起こりえます。
pgtypes
ライブラリはときどき呼び出し側が解放することを想定した文字列を返しますが、この使い方に従うことが不可能になっていました。
free
をラップするPGTYPESchar_free()
関数を追加して、アプリケーションがこの使い方に従えるようにしました。
Windowsでecpgのlong long
変数対応を修正しました。
strtoll
/strtoull
を非標準に宣言する、あるいは全く宣言しない、他のプラットフォームにおいても修正しました。
(Dang Minh Huong, Tom Lane)
PL/pgSQLでSQLステートメントタイプの誤識別を修正しました。 RULEの変更がステートメント内部セッションの文脈の変化をひき起こすときに該当します。 (Tom Lane)
この誤りはアサート失敗、あるいは稀な場合にINTO STRICT
オプションでの期待される強制の失敗をもたらします。
stdin
がターミナルでないときWindowsでエコー出力が適切に無効化されるように、クライアントプログラムでのパスワードプロンプト表示を修正しました。
(Matthew Stickney)
ダンプでのリスト値になっているGUC変数値のクォート間違いをさらに修正しました。 (Tom Lane)
以前のpg_dump出力におけるsearch_path
および他のリスト値変数のクォート処理の修正は、空文字列リスト要素に対して誤動作をして、長いファイルパスが切り捨てられる危険性がありました。
pg_dumpが制約インデックスに対するREPLICA IDENTITY
属性のダンプに失敗していたものが修正されました。
(Tom Lane)
手動で作成したユニークインデックスには適切に属性が付与されますが、UNIQUE
やPRIMARY KEY
制約を宣言することで作られたものはそうなりませんでした。
pg_upgradeが古いサーバがクリーンにシャットダウンされたことを検査するようにしました。 (Bruce Momjian)
これまでの検査ではimmediateモードでのシャットダウンについてだまされる可能性がありました。
Perlスカラ参照を一通り調べて、期待されたハッシュ参照が見つからない場合にクラッシュしないように、contrib/hstore_plperl
を修正しました。
(Tom Lane)
contrib/ltree
のlca()
関数での入力配列が空であったときのクラッシュを修正しました。
(Pierre Ducroquet)
不適切なエラーコードが報告されるかもしれない様々なエラー処理コードパスを修正しました。 (Michael Paquier, Tom Lane, Magnus Hagander)
プログラムが既存のシステムライブラリディレクトリにあるものではなく、ビルドされたばかりのライブラリ(libpq.so
など)に確実にリンクするように、Makefileを調整しました。
(Tom Lane)
これにより、PostgreSQLライブラリの古いコピーを提供するプラットフォームでビルドするときの問題を回避します。
タイムゾーンデータファイルをtzdata release 2018eに更新しました。 北朝鮮の夏時間(DST)法の変更に加え、チェコスロバキアの歴史的修正が含まれます。
この更新には、アイルランドおよび過去の何年間かのでのナミビアやチェコスロバキアにおける「daylight savings」の再定義が含まれます。
これらの管区では法律上、夏に標準時間、冬にDST(訳注:daylight saving timeを通常「夏時間」としているがここでは文脈上DSTとする)であると述べられていて、そのためDSTオフセットは標準時間の1時間後でなく1時間前です。
このことは、実際のUTCオフセットや使われるタイムゾーン略記法のいずれにも影響を与えませんが、唯一の影響として、これらの場合はpg_timezone_names
ビューのis_dst
が冬に真、夏に偽となります。