リリース日: 2015-02-05
このリリースは9.1.14に対し、各種不具合を修正したものです。 9.1メジャーリリースにおける新機能については、E.127を参照してください。
9.1.Xからの移行ではダンプ/リストアは不要です。
しかしながら、9.1.14以前のリリースからアップグレードする場合は、E.113を参照して下さい。
to_char()
のバッファオーバーランを修正しました。
(Bruce Momjian)
to_char()
が大きな桁数をとる数値書式テンプレートを処理するとき、PostgreSQLがバッファ終端を超えて読み取ることがありえました。
また、巧妙に作りこまれたタイムスタンプ書式テンプレートに対して、PostgreSQLがバッファ終端を超えて書き込むことがありえました。
どちらの場合もサーバをクラッシュさせることができます。
可能性は低いと見られますが、権限昇格に至る攻撃ができる可能性も排除できません。
(CVE-2015-0241)
*printf()
置換関数におけるバッファオーバランを修正しました。
(Tom Lane)
PostgreSQLにはprintf
や関連する関数の置き換え実装が含まれています。
およそ500桁以上の精度で浮動小数点数を(変換指定子e
、E
、f
、F
、g
、G
で)整形するとき、これらのコードでスタックバッファオーバランが起きます。
これはサーバをクラッシュさせ、また、権限昇格に至る攻撃ができる可能性も排除できません。データベース利用者はSQL関数to_char()
を通してこのバッファオーバランを起こすことができます。
PostgreSQLコア機能に影響があるほか、printf族の関数を使用している拡張モジュールにも危険があると考えられます。
この問題は主にWindows上のPostgreSQLに影響があります。 PostgreSQLは、その他の現代的なプラットフォーム上では、これら関数のシステム実装を使います。 (CVE-2015-0242)
contrib/pgcrypto
でのバッファオーバランを修正しました。
(Marko Tiikkaja, Noah Misch)
pgcrypto
モジュールでのメモリサイズ追跡の誤りにより、
スタックバッファオーバランと未初期化メモリ内容への不適切な依存が起こりえました。
このバッファオーバランはサーバをクラッシュさせ、また、
権限昇格に至る攻撃ができる可能性も排除できません。
(CVE-2015-0243)
エラー後にフロントエンド/バックエンドプロトコルの同期が失われる可能性があり、 修正しました。 (Heikki Linnakangas)
サーバがクライアントからのメッセージを読んでいる途中に何らかエラーが起きた場合、同期が失われ、メッセージデータの一部分を新たなプロトコルメッセージと解釈しようと誤って試みられる可能性がありました。 攻撃者がコマンドパラメータ中に巧妙に作りこんだバイナリデータを送り出すことで、SQLコマンドを注入することができるかもしれません。 この筋書を引き起こす最もありそうなエラーは、ステートメントタイムアウトと問い合わせキャンセルです。 とりわけ脆弱なのは、タイムアウトを使っていて、任意のユーザ作成データをバイナリの問い合わせパラメータとして送れるアプリケーションです。 ステートメントタイムアウトを無効にすることで、脆弱性を悪用される危険性を無くせはしませんが軽減できます。 本問題を報告してくれた Emil Lenngren 氏に感謝します。(CVE-2015-0244)
制約違反エラーメッセージを通した情報漏洩を修正しました。 (Stephen Frost)
いくつかのサーバエラーメッセージは一意性制約などの制約に違反した列の値を表示します。ユーザがテーブルの全列にSELECT
権限を持たないとすれば、このことは、見ることができてはいけない値が露出していることになります。
該当コードを修正し、値が表示されるのは SQLコマンドに由来する値であるか、ユーザでSELECT
可能であるときだけにしました。
(CVE-2014-8161)
Windows上で回帰テストの一時インストールへの接続制限を厳重にしました。 (Noah Misch)
テスト一式を起動したOSユーザからのみ接続を許すようにSSPI認証を使うようにします。 これは、他のユーザがテスト用postmasterに接続できるという、他のプラットフォーム向けで以前封鎖したのと同様の脆弱性を、Windows上でも封鎖するものです。 (CVE-2014-0067)
ALTER DATABASE SET TABLESPACE
を使ってデータベースを新しいテーブルスペースに移動し、直後に元のテーブルスペースに戻した場合にデータ破損する可能性がある問題を修正しました。
(Tom Lane)
トランザクションの中で実行したANALYZE
をロールバックした際にテーブル破損する問題を修正しました。
(Andres Freund, Tom Lane, Michael Paquier)
以前にテーブルから最新の索引、ルール、トリガーが取り除かれたトランザクションが失敗した時、関連するpg_class
に本来はセットされるべきではない破損状態としてのフラグを伴って表が残されていました。
ログを取らないテーブルがCREATE DATABASE
やALTER DATABASE SET TABLESPACE
中に正しくコピーされることを保証しました。(Pavan Deolasee, Andres Freund)
テーブルを参照する前にそのテーブルを再帰的に参照する場合にDROP
の依存関係を正しく検索するよう修正しました。
(Petr Jelinek, Tom Lane)
拡張がデータ型とそのデータ型を使用するテーブルの両方を作成するときにのみ発生することが知られています。この障害のあるコードは、必要とされるべきではないCASCADE
が指定されていないDROP EXTENSION
が拒否される可能性があります。
EvalPlanQual処理で解放済みメモリを使用してしまう問題を修正しました。 (Tom Lane)
READ COMMITTED
モードで最近に更新した行をロックまたは更新すると、
本障害によりクラッシュする可能性がありました。
子テーブルの部分インデックスを使用した時のSELECT FOR UPDATE
のプランを修正しました。(Kyotaro Horiguchi)
READ COMMITTED
モードの場合、SELECT FOR UPDATE
は部分インデックスのWHERE
条件が最新のupdateされた行がWHERE
条件をまだ満たしているか再度チェックする必要があります。この要件はそのインデックスが継承された小テーブルに付いている場合に失われます。このため、問い合わせ条件を満たしていない行を不正に返す可能性がありました。
稀にSELECT FOR UPDATE
が行を2回返し、他の行を返し損ねる可能性がある問題を修正しました。 (Tom Lane)
READ COMMITTED
モードでは、継承された木を走査するSELECT FOR UPDATE
が後の子テーブルから返すべき行の代わりに前の子テーブルから行を不正に返すことがありました。
FOREIGN KEY
定義の被参照列リストに重複した列名が登録されることを拒絶します。
(David Rowley)
この制限はSQL標準です。以前はこのようなケースは明確には拒絶していませんでした。しかし、後にこのコードは奇妙なロックのエラーを伴って失敗するでしょう。
NUMERIC
型の値を増やしていって冪数が大きくなる時の不具合を修正しました。
(Tom Lane)
以前のコードでは誤った答えを得るか、答えがオーバーフローすることに気づく前に大量の時間とメモリを消費する可能性がありました。
numeric_recv()
はdscale
フィールドの値によって隠されたいかなる小数点以を切り捨てます。
(Tom Lane)
numeric
値の位取り(dscale
)表示は0ではない小数点以下の数値より小さくなってはいけません。
しかし、明らかに、少なくともバイナリのnumeric
の値がそのように変換している壊れたクライアントアプリケーションが存在しました。
表示されていないにも関わらず、小数点以下の挙動が考慮されていたためにこのような奇妙な挙動が引き起こされていました。
引渡しの際のこの「隠された」小数点以下を切り捨てる修正にはリスクがあると思われます。このため、その値を実際に表示するようにしました。
タイムゾーンの仕様範囲外の数値を拒絶します。
単純な数字型のタイムゾーンは+/- 168時間(1週間)を超える指定を許容しますが、特定のオペレーションでヌルポインタを参照することによるクラッシュを引き起こしていました。 そのような大きなUTCオフセットを使用するケースは存在しないため、これを拒絶します。
tsquery
@>
tsquery
演算子の不具合を修正しました。
(Heikki Linnakangas)
2つの異なる用語が同じCRCを保持している場合、これらは一致すると考慮していました。また、もし2つの2番目の演算項目が最初の演算項目より長い範囲を持つ場合、最初の演算項目は2番目の演算項目に含まれないと想定されていました。これらは重複した用語を含んでいる場合、誤りでした。
不正なaffixファイルからispell辞書が守られるように改善しました。 (Tom Lane)
シソーラス辞書に64Kを超える言葉を許容するようにしました。 (David Boutin)
以前のコーディングでは辞書のサイズを超えた場合、クラッシュする可能性がありました。 このため、これは機能追加というより、より前のバージョンにパッチとして適用されたバグフィックスと考えられます。
xpath()
の名前空間の扱いを修正しました。(Ali Akbar)
これまで、入力xml
値で返される指定要素でなく先祖要素に名前空間宣言が付加されているとき、xpath()
呼び出しから返されるxml
値は、名前空間宣言を持ちませんでした。
孤立と見なされるとき結果が正しいなら先祖の宣言を伝搬するようにしました。
継承されたテーブルの中のUNION ALL
サブクエリのような、入れ子追加リレーションのプランナの問題を修正しました。
GiST索引のタプルがページと一致しない場合、無限に再帰に入らず明確にエラーを返します。 (Andrew Gierth)
自動バキュームのテーブルごとのcost_limit
や/またはcost_delay
をグローバルコストのバランスルールから除外します。
(Álvaro Herrera)
以前の挙動では結果として基本的にテーブルごとの設定は意図せず無視されていました。今では、テーブルはこれらの設定に沿って、他の自動バキュームワーカーの実行とは独立して、バキュームされます。この変更により、結果的にトータルI/Oが増えるかもしれませんので、そのような設定がされている場合は健全性のために再試験するべきです。
自動バキュームが名目上offとされている場合は、大規模な自動バキュームが実行されることを避けます。 (Tom Lane)
自動バキュームが名目上offになっていたとしても、依然として自動バキュームワーカープロセスはXID周回問題の危険に備えバキュームを実行します。 しかしながら、いつもの自動バキュームの閾値に達していたとしても、そのワーカープロセスは対象になるデータベースの全てのテーブルにバキュームを実行していました。 この動作は決して期待された動作ではありません。最悪、周回の脅威への対応が遅れます。このため、autovacuumが切られている場合、ワーカープロセスは周回問題を回避するのみのために動作し、他の動作はしません。
クラッシュリカバリ中に、ログを取らないリレーションは空に書き換えられ、リカバリが完了したと見なされる前にディスクの同期がとられるを保証しました。 (Abhijit Menon-Sen, Andres Freund)
データベースのクラッシュリカバリ後にログを取らないリレーションに不要なデータが含まれているかもしれないシナリオを防ぎます。
ホットスタンバイの問い合わせとフルページイメージ再生の競合状態を修正しました。 (Heikki Linnakangas)
この誤りによってホットスタンバイの問い合わせ中に一時的なエラーを返す可能性がありました。
リカバリロジックがCOMMIT/ABORT PREPARED
のWALレコードを不適切に無視するいくつかのケースを修正しました。
(Heikki Linnakangas)
最も注目すべき見過ごしはrecovery_target_xid
が2フェーズコミットで停止に使えないことでした。
タイムラインヒストリーファイルとして.ready
目印ファイルを不必要に作成しないようにしました。
(Fujii Masao)
log_statement
がmod
もしくはddl
に設定されていて、プリペアードステートメントが使用されている場合、NULLポインタから値を取り出す可能性がある問題を修正しました。
(Fujii Masao)
「pgstat wait timeout」というメッセージをWARNINGレベルからLOGレベルに変更して、文言もより分かりやすくしました。 (Tom Lane)
本メッセージは元々は基本的には起こらないケースと考えられていました。 しかし、遅いビルドファームのマシンでたびたび発生して、邪魔になっていました。 LOGレベルに下げ、また、言い回しに幾分の努力を払い、「using stale statistics instead of current ones because stats collector is not responding」 (統計情報コレクタが応答しないため最新でない鮮度に欠けた統計情報を使います)としました。
他のSolaris以外のカーネルと同様に、CPUが非TSO統合モードで実行されているか正確さを保証するための実装のためのSPARCのスピンロックを修正しました。 (Andres Freund)
macOS Xのsetlocale()
が不必要な余計なスレッドをpostmasterの中に作成した際に警告するようにしました。
(Noah Misch)
PQconnectdbParams()
中でdbname
が繰り返された場合の扱いを修正しました。
(Alex Shulgin)
最初のdbname
文字列の出現箇所に接続文字列や拡張のためのURIが含まれていた場合、予期しない挙動をしました。
予期しないソケットのEOFが発生した場合にlibpqがふさわしいエラーメッセージを報告することを保証します。 (Marko Tiikkaja, Tom Lane)
カーネルの挙動によって、サーバーが予期せずソケットを閉じたとき、libpqは役に立つメッセージではなく、空のエラー文字列を返していました。
PQreset()
中の古いエラーメッセージを削除しました。
(Heikki Linnakangas)
PQreset()
が繰り返し呼び出された場合、接続は再確立できず、PGconn
のエラー文字列中に接続の試行に失敗したメッセージが蓄積されていました。
libpqの接続解析オプション中にメモリ不足状態を適切に取り扱うようにしました。 (Alex Shulgin, Heikki Linnakangas)
ecpgバージョンのParseDateTime()
で配列オーバーランする問題を修正しました。
(Michael Paquier)
initdbでパスワードファイルが指定されたが中身が空であった場合のエラーメッセージをより分かりやすくしました。 (Mats Erik Andersson)
libedit(Editline library)を使用しているpsqlの\s
コマンドがよく動くようになりました。また、ページャに対応しました。
(Stepan Rutz, Tom Lane)
readlineではなくlibeditを使用している場合、\s
は全く読めないエンコードのフォーマットでコマンドの履歴を表示していました。
最近のバージョンのlibeditでは完全に失敗していました。ライブラリが履歴を表示せずに、履歴そのものを出力することで修正しました。
喜ばしい副次効果としてページャが割り当てられた時に使用されるようになりました。
このパッチではコマンドの履歴をlibeditで保存した際、新しい行のエンコーディングを一貫性無く適用してしまう不具合も修正しています。 古いpsqlで書かれた複数行の実行履歴はこのパッチによって明確に読めるようになります。しかし、恐らく逆は成り立たず、 含まれる正確なlibeditのバージョンに依存します。
psql特別変数の解析について一貫性を改善しました。 (Tom Lane)
ECHO_HIDDEN
とON_ERROR_ROLLBACK
に対してon
とoff
を異なる書き方(1
/0
など)で書けるようになります。
COMP_KEYWORD_CASE
、ECHO
、ECHO_HIDDEN
、HISTCONTROL
、ON_ERROR_ROLLBACK
、および、VERBOSITY
に対して解釈できない値には警告するようになります。
全ての特別変数の値について大文字小文字の区別なく受け付けるようになります。
これまでは大文字小文字の区別があるものと無いものが混在していました。
border
を3とし、linestyle
が ascii
もしくはunicode
の場合、psqlの拡張表示が一貫して動作するように修正しました。
(Stephen Frost)
データベースが同じ2つのオブジェクトの間の複数の依存状態パスの多くのインスタンスを含んでいる場合のpg_dumpの性能を改善しました。(Tom Lane)
スキーマのみが出力されたダンプファイルを並列でリストアする際にデッドロックが発生することがある問題を修正しました。 (Robert Haas, Tom Lane)
列が無い複合型のpg_dump --binary-upgrade
でコアダンプする問題を修正しました。
(Rushabh Lathia)
pg_basebackup -x/-X
で作られたWALファイルが、スタンバイが昇格したときに再度アーカイブされることを防止しました。
(Andres Freund)
contrib/citext
のunpackagedからのアップグレードスクリプトを修正しました。(Tom Lane)
contrib/pageinspect
のget_raw_page()
でのブロック番号確認を修正しました。
(Tom Lane)
誤った確認ロジックは主ではないリレーションから分岐したリレーションのページアクセスを妨げる可能性がありました。
contrib/pgcrypto
のpgp_sym_decrypt()
でメッセージ長が2の冪乗から6小さい場合に失敗しないように修正しました。
(Marko Tiikkaja)
contrib/pg_test_fsync
のファイルデスクリプタのリークを修正しました。
(Jeff Janes)
これはWindows上のテンポラリファイルの削除に失敗する場合がありました。
contrib/tablefunc
のconnectby()
で、予想外の問い合わせ結果(特にNULL)を安全に扱えるようにしました。
(Michael Paquier)
これまでconnectby()
はNULLのキー値に遭遇するとクラッシュしていました。現在はその行を出力しますが更なる再帰はしません。
contrib/xml2
のxslt_process()
でクラッシュしないようになりました。
(Mark Simonetti)
libxsltにはリソース開放に明文化されていない順序の依存関係があるようです。クラッシュを避けるように再規定しました。
いくつかのcontrib
のI/O関数に変動性のプロパティを印付けました。(Tom Lane)
以前の消極的すぎる印付でも通常の使用では影響は軽微でした。しかし、最適化の問題や、有効なインデックス式の定義の拒絶を引き起こす可能性があります。結果は大きく影響しないので、私たちはバージョン番号を変更せずに、拡張モジュールのスクリプトで関数定義を調整しました。
Coverity静的コード解析からの多数の警告を一掃しました。 (Andres Freund, Tatsuo Ishii, Marko Kreen, Tom Lane, Michael Paquier)
ほとんどは表面的な変更ですが、一部は稀に起こりうるバグの修正で、メモリ不足で失敗した後に適切なエラーを出さずクラッシュする例があります。 セキュリティ問題は無いと考えられます。
ビルド中にOpenLDAPのバージョンの非互換を検出するようになりました。 (Noah Misch)
OpenLDAPのバージョン2.4.24から2.4.31(2.4.31を含む)では、PostgreSQLのバックエンドは終了時にクラッシュすることがありました。
コンパイル時のOpenLDAPバージョン番号を元に configureで警告を上げ、contrib/dblink
のリグレッションテストでクラッシュシナリオで試験します。
MSVCが無いWindowsのビルドでlibpq.dll
が実行権限有りでインストールされるようになりました。
(Noah Misch)
pg_regressが成功して終了したら、一時インストールで作成したものを全て削除するようにしました。 (Tom Lane)
make check-world
では多数の一時インストール作成を必要とするため、これは、make check-world
実行におけるかなりのディスク使用量削減になります。
UTCオフセットが変化するタイムゾーン略称をサポートしました。 (Tom Lane)
これまでPostgreSQLでは(EST
などの)一つのタイムゾーン略称に関連づけられたUTCオフセットは、いかなるロケールでの使用でも変化しないと仮定していました。
しかしながら、実世界においてこの仮定は失敗しました。そこで、意味するUTCオフセットをときに変更できるタイムゾーン略称を導入しました。
1970年以来の略称のUTCオフセットが変更されたタイムゾーンロケールで本機能を使えるように(IANAタイムゾーンデータベースに基づいて)ゾーン略称定義ファイルを刷新しました。これからはPostgreSQLは、略称に日付に応じた適切なUTCオフセットを関連づけます。
タイムゾーンの略称リストを更新しました。 (Tom Lane)
CST(中国標準時)をリストに追加しました。 「アラビア夏時間」を意味するADTへの参照を取り除きました。 2007年よりこの略称は使用されていませんでした。そのため、「大西洋夏時間」と競合しているという主張は全く有用ではありませんでした。 CKT(クック諸島)、FJTおよびFJST(フィジー)のGMTからの完全に誤ったオフセットを修正しました。 それらは日付変更線すら適切ではありませんでした。
tzdataリリース2015aを更新しました。
IANAタイムゾーンのデータベースは南半球で現在最も多く実用されていると思われるオーストラリアの全てのタイムゾーンでA
/x
STA
書式の略称に対応しています。
これらの名前は他の略称と競合することはありません。(1994年より使われなくなったアクレ夏時間のACSTを除く)
その結果、これらの名前は「Default」のタイムゾーンの略称のセットに採用されました。
「Australia」 の略称セットは今では最も古くから利用されていると考えられる、CST, EAST,EST, SAST, SAT, そして WSTのみが含まれます。
SASTは「Default」の略称セットとして南アフリカ標準時間に変更された点に注意してください。
x
DT
SRET(アジア/スレドネコリムスク)、XJT(アジア/ウルムチ)、西サモアで使われるWSST/WSDTのタイムゾーンも追加されました。 また、チリ、メキシコ、タークス・カイコス諸島(アメリカ/グランドターク)、フィジーで夏時間の変更がありました。 新しく、パプアニューギニアの太平洋時間/ブーガンビルを加えました。 また、1970年以前の歴史的なタイムゾーンのデータを大量に修正しました。