このリリースは 9.1.14 からの修正リリース(2015/2/5リリース)です。
9.1.x からのアップデートではダンプ、リストアは不要です。
また、9.1.14 より前のバージョンからアップデートを行う場合は 9.1.14 に関する技術情報を参照してください。
PostgreSQL 9.1.14 から 9.1.15 への変更点
9.4.1、9.3.6、9.2.10、9.1.15、9.0.19 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- to_char() 関数のバッファオーバーランが修正されました。 (Bruce Momjian) (9.4)(9.3)(9.2)(9.1)(9.0)
- 内部的に使われる *printf() 置き換え関数群でバッファオーバーランが修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 拡張モジュール contrib/pgcrypto のバッファオーバーランが修正されました。 (Marko Tiikkaja, Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- エラー後に PostgreSQLプロトコルの同期が失われる可能性があり、修正されました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)(9.1)(9.0)
- 制約違反エラーメッセージを通した情報漏洩が修正されました。 (Stephen Frost) (9.4)(9.3)(9.2)(9.1)(9.0)
- Windows 上で回帰テスト用の一時的なインスタンスへのアクセスが制限されました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- Windows ロケール名「Norwegian (Bokmål)」に対応しました。 (Heikki Linnakangas) (9.4)(9.3)(9.2)
- EvalPlanQual処理で解放済みメモリを参照してしまう障害が修正されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- 行ロック取得を試みるときの EvalPlanQual処理においてデッドロックになる可能性があり、修正されました。 (Álvaro Herrera, Mark Kirkwood) (9.4)(9.3)
- 複数の他トランザクションが同時に FOR SHARE 行ロックを保持している中で、トランザクションが FOR NO KEY UPDATE 行ロックの取得を試みて待つのに失敗してしまう障害が修正されました。 (Álvaro Herrera) (9.4)(9.3)
- テーブルやカラムが多数あるクエリに対する EXPLAIN の性能が改善されました。 (Tom Lane) (9.4)(9.3)
- jsonb データ型における Unicode エスケープについて修正され、結論として u0000 は使用できなくなりました。 (Tom Lane) (9.4)
- xpath() 関数の名前空間の扱いが修正されました。 (Ali Akbar) (9.4)(9.3)(9.2)(9.1)(9.0)
- 範囲演算子の選択率見積で、いくつか軽微な誤りが修正されました (Emre Hasegeli) (9.4)(9.3)
- 意図しない GIN インデックスの要素最大サイズの引き下げが元に戻されました。 (Heikki Linnakangas) (9.4)
- GIN インデックスのスキャン繰り返しで、一つのクエリ実行の間のメモリリークがあり、修正されました。 (Heikki Linnakangas) (9.4)
- gin_fuzzy_search_limit 設定パラメータにゼロ以外を設定したとき、バックエンドプロセスのクラッシュをひき起こすことがあり、修正されました。 (Heikki Linnakangas) (9.4)
- ロジカルデコーディング機能についていくつか修正されました。 (Andres Freund) (9.4)
- パラメータ変更をする WALレコードのリプレイが修正されました。 (Petr Jalinek) (9.4)
- 実行時統計情報収集のタイムアウトのログレベルが WARNING から LOG に変更されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- OS X (Darwin) の setlocale() ライブラリ関数が PostgreSQL マスタプロセス内で新たにスレッドを起動する場合に警告とヒントを出すようになりました。 (Noah Misch) (9.4)(9.3)(9.2)(9.1)(9.0)
- /etc/passwd が読めないときの libpq の振る舞いが修正されました (Tom Lane) (9.4)
- psql 特別変数の値の解析が一貫性を持つように改善されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- pg_dump でイベントトリガーに対するコメントのダンプに失敗していたのが修正されました。 (Tom Lane) (9.4)(9.3)
- pg_dump で並列実行する --jobs (-j) オプションとともに--serializable-deferrable オプションが利用可能になりました。 (Kevin Grittner) (9.4)(9.3)
- pg_basebackup の -x / -X オプションで作られた WALファイルが、昇格した際に再度アーカイブされないように修正されました。 (Andres Freund) (9.4)(9.3)(9.2)(9.1)
- contrib/tablefunc の connectby() 関数で、予想外のクエリ結果、特に NULLを安全に扱えるようになりました。 (Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- Coverity の静的コード解析の警告に基づき多数の修正が行われました。 (Andres Freund, Tatsuo Ishii, Marko Kreen, Tom Lane, Michael Paquier) (9.4)(9.3)(9.2)(9.1)(9.0)
- configure 実行時の環境変数 CFLAGS で自動設定される値を上書きできるようになりました。 (Tom Lane) (9.4)
- pg_regress が成功終了時には作成する一時インスタンスのファイルを全て削除するようになりました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- タイムゾーン省略名 CST (China Standard Time) が追加されました。 (Tom Lane) (9.4)(9.3)(9.2)(9.1)(9.0)
- タイムゾーンデータが tzdata release 2015a に更新されました。 (9.4)(9.3)(9.2)(9.1)(9.0)
- ALTER DATABASE .. SET TABLESPACE でデータベースのテーブルスペースを移動して、そのあとすぐに元のテーブルスペースに戻すときにデータ破損の可能性があり、修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- トランザクション内で DDL と共に ANALYZE を実行してロールバックするときのテーブル破損を回避するように修正されました。 (Andres Freund, Tom Lane, Michael Paquier) (9.3)(9.2)(9.1)(9.0)
- UNLOGGEDテーブルが CREATE DATABASE や ALTER DATABASE .. SET TABLESPACE で確実に正しくコピーされるように修正されました。 (Pavan Deolasee, Andres Freund) (9.3)(9.2)(9.1)
- CREATE EVENT TRIGGER コマンドの実装誤りが修正されました。 (Petr Jelinek) (9.3)
- テーブルのカラムが再帰的に参照される場合の DROP コマンドの依存性確認動作が修正されました。 (Petr Jelinek, Tom Lane) (9.3)(9.2)(9.1)
- 部分インデックスが子テーブルにあるときの SELECT .. FOR UPDATE に対する実行プランが修正されました。 (Kyotaro Horiguchi) (9.3)(9.2)(9.1)(9.0)
- 継承テーブルに対して SELECT .. FOR UPDATE が同じ行を2回返すことがあり、修正されました (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- 外部キー制約定義で重複したカラム名を受け入れないようになりました。 (David Rowley) (9.3)(9.2)(9.1)(9.0)
- 「SELECT .. OFFSET -1」がエラーになるように修正されました。 (Tom Lane) (9.3)
- ドメインを JSON に変換するときの振る舞いが元に戻されました。 (Tom Lane) (9.3)(9.2)
- json_agg() 関数が末尾に余計な右ブラケット(])付けてを返さないように修正されました。 (Tom Lane) (9.3)
- 整数べき乗計算の誤りが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- NUMERICデータ型のバイナリ入力関数 numeric_recv() で表示桁数属性にしたがえば見えない微小桁を切り捨てるようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- 正規表現の最短一致の誤りが修正されました。 (Tom Lane) (9.3)(9.2)
- 数値による timezone 設定値の指定で範囲外の値を拒絶するようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- 演算子「tsquery @> tsquery」の障害が修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- 全文検索で Ispell辞書を作る際に接辞ファイル(AffFile) に指定したファイルが不適切である場合にクラッシュしないように修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- 全文検索の類語辞書にて、一つのエントリに 65536 以上の語句を指定できるようになりました。 (David Boutin) (9.3)(9.2)(9.1)(9.0)
- 行全体の変数値と複合引数の処理が修正されました。 (Tom Lane) (9.3)(9.2)
- postgres_fdw のクエリでシステムカラムの扱いについて修正されました。 (Etsuro Fujita) (9.3)(9.2)
- インデックスの付いたカラムに対して「col = ANY ( array ) 」を実行する際に劣ったプランになるのを避けるようになりました。 (Andrew Gierth) (9.3)(9.2)
- 「ERROR: variable not found in subplan target lists」メッセージが出る障害が修正されました。 (Tom Lane) (9.3)
- UNION ALL のサブクエリ内における継承テーブルのように、入れ子で Append 処理が行われる場合のプランナの問題が修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- GiST インデックス要素がページに適合していない場合に正常にエラーを出すように修正されました。 (Andrew Gierth) (9.3)(9.2)(9.1)(9.0)
- 自動VACUUM でテーブル毎の cost_limit、cost_delay 指定がある場合、グローバルなこれらコストバランス規則からは除外するようになりました。 (Álvaro Herrera) (9.3)(9.2)(9.1)(9.0)
- autovacuum = off であるとき、大規模な自動VACUUM 処理を回避するようになりました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- クラッシュリカバリ中、リカバリが完了する前に、UNLOGGED テーブルを空にしてディスク同期するようになりました。 (Abhijit Menon-Sen, Andres Freund) (9.3)(9.2)(9.1)
- ホットスタンバイのクエリと、フルページイメージのリプレイの競合状態が修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- COMMIT/ABORT PREPARED の WALレコードを不適切に無視するリカバリロジックがいくつか修正されました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- クラッシュリカバリ完了時に、最新のWALファイルが再度アーカイブされないように修正されました。 (Fujii Masao) (9.3)(9.2)
- タイムラインヒストリファイルに必要のない .ready マーカーファイルが作成されないように修正されました。 (Fujii Masao) (9.3)(9.2)(9.1)(9.0)
- log_statement が mod もしくは ddl で、空のプリペアドステートメントが使用されたときにヌルポインタ参照が起こらないように修正されました。 (Fujii Masao) (9.3)(9.2)(9.1)(9.0)
- マスタプロセスの動的バックグラウンドワーカーのリストが破損する可能性があり、修正されました。 (Andres Freund) (9.3)
- いくつかのnon-Solaris カーネルがそうするように SPARC のスピンロックをCPU が non-TSO コヒーレンシーモードでの正確な動作を保証するように修正されました。 (Andres Freund) (9.3)(9.2)(9.1)(9.0)
- PQconnectdbParams() 関数で dbname パラメータが繰り返されたときの処理が修正されました。 (Alex Shulgin) (9.3)(9.2)(9.1)(9.0)
- libpq が報告する予期しないソケットのEOFに関するメッセージを適切なものにしました。 (Marko Tiikkaja, Tom Lane) (9.3)(9.2)(9.1)(9.0)
- PQreset() 関数実行中の古いエラーメッセージが消去されるようになりました。 (Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- libpq 接続オプションの構文解析におけるメモリ不足状態を適切に扱えるようになりました。 (Alex Shulgin, Heikki Linnakangas) (9.3)(9.2)(9.1)(9.0)
- ParseDateTime() 関数の ecpg バージョンにおける配列オーバーランが修正されました。 (Michael Paquier) (9.3)(9.2)(9.1)(9.0)
- initdb 実行時、パスワードファイルが指定されているにも関わらずその内容が空の場合、エラーメッセージを明示的に出力するようになりました。 (Mats Erik Andersson) (9.3)(9.2)(9.1)(9.0)
- 最近の libedit を利用している psql の s コマンドがうまく働くようになり、ページャのサポートが付加されました。 (Stepan Rutz, Tom Lane) (9.3)(9.2)(9.1)(9.0)
- psql の watch コマンドで pset null で指定した null 表示を適用するようになりました。 (Fujii Masao) (9.3)
- psql 拡張形式表示で border が 3 で、linestyle が ascii または unicode であるときに、一貫した表示になるように修正されました。 (Stephen Frost) (9.3)(9.2)(9.1)(9.0)
- pg_dump でオブジェクトの依存関係を調べる処理が改善され、性能が向上しました。 (Tom Lane) (9.3)(9.2)(9.1)
- pg_dumpall が 8.1 以前のサーバをダンプできるように修正されました。 (Gilles Darold) (9.3)(9.2)
- (pg_dump -s オプションによる) 定義のみのダンプを並行リストアするときに発生しうるデッドロックが修正されました。 (Robert Haas, Tom Lane) (9.3)(9.2)(9.1)(9.0)
- カラムを一つも持たない複合型があるとき pg_dump --binary-upgrade がクラッシュしていたものが修正されました (Rushabh Lathia) (9.3)(9.2)(9.1)(9.0)
- pg_upgrade でデフォルトでないテーブルスペースのテーブルに対する fsyncに失敗していて、修正されました。 (Abhijit Menon-Sen, Andres Freund) (9.3)
- pg_upgrade で新しいクラスタが TOAST を持たないテーブルに対して事前にTOAST テーブルを作成するときに適切に動作するように修正されました。 (Bruce Momjian) (9.3)
- pg_upgrade で autovacuum_multixact_freeze_max_age を古いクラスタに対して設定しないようになりました。 (Bruce Momjian) (9.3)
- pg_upgrade で、トランザクションID のエポック時間が保たれるように修正されました。 (Bruce Momjian) (9.3)
- pg_receivexlog コマンドのメモリリークが修正されました。 (Fujii Masao) (9.3)
- pg_receivexlog コマンドの verbose メッセージが意図せず抑制されており、修正されました。 (Fujii Masao) (9.3)
- contrib/auto_explain が EXPLAIN ANALYZE 実行時に計画ノードごとの所用時間情報の出力に失敗することがあり、修正されました。 (Tom Lane) (9.3)(9.2)
- contrib/citext のアップグレードスクリプトが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)
- contrib/hstore の hstore_to_json() 関数による整数オーバーフローと (Heikki Linnakangas) (9.3)
- hstore_to_json_loose() 関数による数値の認識処理が修正されました。 (Andrew Dunstan) (9.3)
- contrib/pageinspect の get_raw_page() 関数によるブロック数のチェックが修正されました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
- contrib/pgcrypto の pgp_sym_decrypt() 関数で、メッセージ長がちょうど 2 の乗数から 6 を引いた長さである場合に失敗しており、修正されました。 (Marko Tiikkaja) (9.3)(9.2)(9.1)(9.0)
- contrib/pg_test_fsync によるファイルディスクリプタリークが修正されました。 (Jeff Janes) (9.3)(9.2)(9.1)
- contrib/xml2 の xslt_process() 関数がクラッシュを回避するように修正されました。 (Mark Simonetti) (9.3)(9.2)(9.1)(9.0)
- contrib モジュールのデータ型追加のための入出力関数のいくつかに、適切な揮発性の指定が付加されました。 (Tom Lane) (9.3)(9.2)(9.1)
- バックグラウンドワーカープロセスの初期化について修正されました。 (Robert Haas) (9.3)
- ビルド時に互換性のない OpenLDAPバージョンを検知するようになりました。 (Noah Misch) (9.3)(9.2)(9.1)(9.0)
- Visual C 以外での Windows むけビルドで、libpq.dll が確実に実行権限を付加してインストールされるように修正されました。 (Noah Misch) (9.3)(9.2)(9.1)(9.0)
- UTCオフセットが変化するタイムゾーン略記法に対応しました。 (Tom Lane) (9.3)(9.2)(9.1)(9.0)
桁数の大きい数値を書式整形するとき、バッファ終端を超えた場所を読み取ってしまうことがありえました。また、作りこまれたタイムスタンプ出力書式において、バッファ終端を超えた位置に書き込むことがあえりました。どちらの場合もバックエンドプロセスのクラッシュを引き起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。
本セキュリティ障害は CVE-2015-0241 として登録されています。
PostgreSQL 実装には printf などの置き換え関数が含まれています。その中で浮動小数点値の整形(指定子 'e'、'E'、'f'、'F'、'g'、'G')をおよそ 500 以上の精度を指定して行うとき、スタックのバ
ッファオーバーランが生じ、バックエンドプロセスのクラッシュをひき起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。PostgreSQLコア機能の他、printf族を利用している拡張モジュールにも影響があります。
本障害は主として Windows 上で影響があります。Windows においてこれらの置き換え関数が使用されます。 PostgreSQL は適切なシステム実装がある場合には、置き換え関数群でなく、システム実装の関数を使用します。
本セキュリティ障害は CVE-2015-0242 として登録されています。
pgcrypto モジュールにてメモリサイズ追跡の誤りにより、スタックのバッファオーバーランと未初期化メモリ内容への依存が生じる余地がありました。本バッファオーバーランはバックエンドプロセスのクラッシュをひき起こします。本障害を利用した攻撃での権限昇格の可能性も排除できません。
本セキュリティ障害は CVE-2015-0243 として登録されています。
バックエンドプロセスがクライアントからのメッセージを読んでいる途中に何らかエラーが起きた場合、同期が失われ、メッセージの一部分を新たなメッセージとして解釈しようと誤って試みられます。この障害により、攻撃者がコマンドパラメータ中に作りこまれたバイナリデータを送り出すことで、SQL インジェクションを実現できる可能性がありました。
本障害ケースをひき起こす「プロトコル処理途中でのエラー」は、代表的には、ステートメントタイムアウトや問い合わせのキャンセルです。タイムアウトを使用していて、かつ、任意のユーザ作成バイナリデータをクエリパラメータで渡せるアプリケーションにおいて、特に脆弱性が生じます。ステートメントタイムアウトを使わないことで完全ではありませんがリスクを軽減できます。
本セキュリティ障害は CVE-2015-0244 として登録されています。
ユニーク制約違反など、いくつかのサーバエラーメッセージで制約違反した値を出力しています。ユーザが SELECT 権限を持たないとすれば、見ることができないはずの値が見えてしまうことになります。
本セキュリティ障害は CVE-2014-8161 として登録されています。
(権限のあるユーザでエラーを出すと、従来通り値も表示される) db1=# INSERT INTO t1 VALUES (0, 'XX'), (1, 'XX'), (2, 'XX'); ERROR: duplicate key value violates unique constraint "t1_pkey" DETAIL: Key (id)=(1) already exists. (INSERT 権限はあっても SELECT 権限のないユーザでは、値が表示されないようになる) db1=> SELECT * FROM t1; ERROR: permission denied for relation t1 db1=> INSERT INTO t1 VALUES (0, 'XX'), (1, 'XX'), (2, 'XX'); ERROR: duplicate key value violates unique constraint "t1_pkey"
SSPI 認証を使うことでテストを起動した OS ユーザのみが接続できるようになりました。これまで他のユーザがテスト中の PostgreSQL に接続することができました。
本セキュリティ障害は CVE-2014-0067 として登録されています。
非アスキー文字のロケール名はエンコーディングが定まらないと判別できない問題があります。「Norwegian (Bokmål)」は、ASCII 文字だけで表現される別名「Norwegian_Norway」にマップされます。9.4.0 では「norwegian-bokmal」にマップしていましたが、これは全ての Windows で利用可能な名称ではありませんでした。
EvalPlanQual処理は、READ COMMITTED トランザクション隔離モードでの行の削除・更新・ロックで使われる内部的な仕組みです。
READ COMMITTED トランザクション隔離モードで、行ロックまたは UPDATE を最近更新した行に対して行うとき、バックエンドプロセスがクラッシュする可能性がありました。
後からの FOR NO KEY UPDATE 行ロックの取得で、本来ブロックされるべきところ、取得できてしまう動作ケースがありました。
9.4.0 バージョンでは JSON の Unicode エスケープ「u0000」は受け付けられ6文字のデータとして格納されていました。このことは「\u0000」が入力された場合と区別がつかず、さらに、->> 演算子などで文字列型に変換して出力するときに「u0000」とエスケープを残した形で出力され、一貫性に欠けた振る舞いになります。一方で PostgreSQL は文字列に x00 を含めることができません。
jsonb型への入力で「u0000」は受け付けないものとなりました。既に格納されているデータは「\u0000」が格納されているものとして扱われます。
json型では引き続き「u0000」の格納を受け付けます。これは、たとえデータベース文字エンコーディングが UTF8 でなくとも 非ASCII の Unicode エスケープを受け付けるのと同じことです。ただし、テキスト出力時の例外処理は無くなります。
db1=# SELECT '["u0041"]'::json ->> 0; ?column? ---------- A (1 row) (9.4.0 の場合) db1=# SELECT '["u0000"]'::jsonb ->> 0; -- 例外的な出力になる ?column? ---------- u0000 (1 row) (9.4.1 の場合) db1=# SELECT '["u0000"]'::jsonb; -- jsonb型には格納も不可 ERROR: unsupported Unicode escape sequence db1=# SELECT '["u0000"]'::json; -- json型なら格納はできる json ------------ ["u0000"] (1 row) db1=# SELECT '["u0000"]'::json ->> 0; -- テキスト出力ではエラーになる ERROR: unsupported Unicode escape sequence DETAIL: u0000 cannot be converted to text.
これまで、xpath() 呼び出しから返される XML値は、入力 XML値の祖先要素に名前空間宣言が付加されていたとしても、名前空間宣言を持ちませんでした。修正で祖先要素の宣言が反映されるようになりました。
db1=# SELECT xpath('//loc:piece', $$ <local:data xmlns:local="http://127.0.0.1"> <local:piece id="1">number one</local:piece> <local:piece id="2" /> </local:data> $$, ARRAY[ARRAY['loc', 'http://127.0.0.1']]); (修正前の応答) xpath ------------------------------------------------------------------------------ {"<local:piece id="1">number one</local:piece>","<local:piece id="2"/>"} (1 row) (修正後の応答) xpath ------------------------------------------------------------------------------------------------------------------------------------------------ {"<local:piece xmlns:local="http://127.0.0.1" id="1">number one</local:piece>","<local:piece xmlns:local="http://127.0.0.1" id="2"/>"} (1 row)
プランナエラー「ERROR: unexpected operator NNNN」の発生が修正されます。また、そのほかのいくつかのケースで選択率の見積が改善されます。
(修正前のエラーを起こす例) db1=# CREATE TABLE t_nr (nr numrange); db1=# SELECT * FROM t_nr WHERE nr < 'empty'; ERROR: unexpected operator 3884
9.4.0 では、以前のバージョンでは受け入れられていたデータに対して、「ERROR: index row size 〜 exceeds maximum 〜」エラーが出ることがありました。
(以下は 9.4.0 でエラーになりますが 9.4.1 では INSERT 可能です) db1=# CREATE TABLE t_gin (tags text[]); db1=# CREATE INDEX ON t_gin USING gin (tags); db1=# INSERT INTO t_gin VALUES (ARRAY[repeat('a', 120000)]); ERROR: index row size 1400 exceeds maximum 1352 for index "t_gin_tag_idx"
wal_log_hints の設定変更が正しくリプレイされませんでした。
メッセージも「WARNING: pgstat wait timeout」から、より丁寧な「LOG: using stale statistics instead of current ones because stats collector is not responding」というものになります。
マルチスレッド化すると内部的なシグナル処理で不具合が生じる可能性があります。LC_ALL 環境変数に有効なロケールを設定しておくことが回避策となります。
「LOG: postmaster became multithreaded during startup」「HINT: Set the LC_ALL environment variable to a valid locale.」というメッセージが出力されるようになります。
PQsetdbLogin() 関数を実行するとき、libpq は OS 上のユーザ名を確認しようとします。ほとんどの UNIX プラットフォームでは /etc/passwd が参照されます。
9.4.0 では /etc/passwd が読めない場合には常にエラーとして扱っていましたが、従来の、データベースロール名が明示されない場合のみエラーにするという振る舞いに戻されました。これにより chroot されて /etc/passwd がない環境に対応します。
ECHO_HIDDEN と ON_ERROR_ROLLBACK で on 、off を様々な書き方で与えることができるようになりました(1、0、true、false など)。
COMP_KEYWORD_CASE 、ECHO 、ECHO_HIDDEN 、HISTCONTROL 、ON_ERROR_ROLLBACK 、および VERBOSITY で、解釈できない値について警告がでるようになりました。
全ての特別変数の値について大文字小文字の区別なく受け付けるようになりました。これまでは区別があるもの、ないものが混在していました。
(失敗例) db1=# COMMENT ON EVENT TRIGGER my_event_trg IS 'comment of event trigger'; db1=# q $ pg_dump db1 > db1.dump cannot duplicate null pointer (internal error)
これまではエラーとなっていました。
これまで -x / -X オプションで取得した WAL ファイルは未アーカイブの扱いになっていました。wal_keep_segment 設定等でオンライン WAL ファイル数が多いとき、昇格後これらをアーカイブするのに時間を要していました。
これまで keyid カラムに NULL があるときクラッシュしていました。
ほとんどは表面的な変更ですが、一部においてまれな障害ケースも修正されています。メモリ不足で失敗した際に適切なエラーを出さず、クラッシュしてしまう個所がありました。セキュリティ問題はないものと考えられます。
これまでは configure スクリプトにより CFLAGS の末尾にオプションが追記され、コンパイラが先頭から解釈するために、ユーザ定義した内容を上書きしていました。あらかじめ CFLAGS に設定してあった文字列を末尾に置くようになりました。
(従来) CFLAGS="{あらかじめCFLAGSに設定してあった内容} {configureで付加される内容} " (修正後) CFLAGS="{configureで付加される内容} {あらかじめCFLAGSに設定してあった内容} "
9.3 以前のバージョン系列では、ADT (Arabia Daylight Time) の削除、CKT (Cook Islands)、FJT、FJST (Fiji) のオフセットの修正も行われています。これらは 9.4.0 時点で適用済みでした。
チリ、メキシコの夏時間法が変更され、アイスランドの歴史的変更が適用されています。
9.3 以前のバージョン系列では、オーストラリアのタイムゾーンに略記法 AxST/AxDT を採用、そのほか略記法に SERT (Asia/Srednekolymsk) 、XJT (Asia/Urumqi)、WSST/WSDT (西サモア) を追加、Pacific/Bougainville タイムゾーン追加、という変更が適用さ
れています。これらは tzdata release 2014j での更新内容で、9.4.0バージョンで既に適用されていました。
トランザクション内で ANALYZE に先だってインデックス削除、ルール削除、(制約を含む)トリガー削除を行う場合に該当します。
これらコマンドで UNLOGGEDテーブルについてもストレージ同期処理が行われるようになりました。
本障害により、テーブルスペース移動後のチェックポイント処理にて、以下メッセージ出て失敗するケースが報告されていました。
ERROR: checkpoint request failed ERROR: could not open file "pg_tblspc/16543/PG_9.3_201411111/16555/16666": No such file or directory
本コマンドをプリペアドクエリまたは拡張プロトコルで実行するときに、正しく動作しませんでした。
拡張モジュールがデータ型とそのデータ型を使ったテーブルの両方を定義する場合に該当します。これまで CASCADE を付けない DROP EXTENSION が不必要に失敗することがありました。
READ COMMITED トランザクションモードでの SELECT .. FOR UPDATE を継承を伴う親テーブルに対して行い、その子テーブルの部分インデックスが使われる場合に、本障害で誤った結果行が返る可能性がありました。
READ COMMITTED トランザクションモードで継承テーブル(親テーブル)に対して SELECT .. FOR UPDATE を行うとき、次の子テーブルの行を返すべきところで誤って手前の子テーブルの行を返してしまうことがありえました。
この制限は SQL標準にしたがったものです。これまでは明確に排除していませんでしたが、後で奇妙なエラーが生じていました。
(修正後バージョンで以下のエラーが出るようになります) db1=# CREATE TABLE t_mas (id int primary key); db1=# CREATE TABLE t_ref (id int PRIMARY KEY REFERENCES t_mas (id, id)); ERROR: foreign key referenced-columns list must not contain duplicates
PostgreSQL 8.4 以降からは OFFSET に負値を与えるとエラーになるのが本来の動作でしたが、9.3 バージョン系列では OFFSET 指定が無いものとして、SELECT が動作してしまっていました。
numeric型および boolean型に対するドメインのデータを変換するときに、ベース型と同じ扱いで変換するようになります。
9.3.5 以前、9.2.9 以前のバージョンではそのように動作していましたが、関連する別の問題を修正する際に振る舞いが変ってしまっていました。
(動作例) db1=# CREATE DOMAIN d_numeric AS numeric ; db1=# CREATE DOMAIN d_boolean AS boolean ; db1=# CREATE TABLE tc (b1 boolean, n1 numeric); db1=# CREATE TABLE td (b1 d_boolean, n1 d_numeric); db1=# INSERT INTO tc VALUES (true, 100); db1=# INSERT INTO td VALUES (true, 100); db1=# SELECT row_to_json(tc.*) FROM tc; row_to_json ---------------------- {"b1":true,"n1":100} (1 row) (9.3.5 / 9.2.9 の場合) db1=# SELECT row_to_json(td.*) FROM td; row_to_json ----------------------- {"b1":"t","n1":"100"} (1 row) (9.3.6 / 9.2.10 の場合) db1=# SELECT row_to_json(td.*) FROM td; row_to_json ---------------------- {"b1":true,"n1":100} (1 row)
大きいべき乗数を与えた場合に、誤った答えが返ったり、オーバーフローと判別するまでに大量にメモリを消費して長時間を要することがありました。
(障害動作例:以下2つはゼロかゼロに非常に近い値が返るはず) db1=# SELECT 10.0 ^ -2147483648; rounds_to_zero -------------------- 1.0000000000000000 (1 row) db1=# SELECT 10.0 ^ -2147483647; ERROR: division by zero (以下は「ERROR: value overflows numeric format」とならなければいけない) db1=# SELECT 10.0 ^ 2147483647 ; overflows -------------------- 0.0000000000000000 db1=# SELECT 117743296169.0 ^ 1000000000 ; ... 長時間応答なし
クライアントからバイナリデータで投入された numeric 値で、表示される桁より小さな桁の値が保持されていて、値の演算を経て顕在化する奇妙な動作がありました。
最短一致指定を付けた場合にマッチに失敗することがありました。
(修正前の障害動作例:最短一致指定で + の後の ? を付けるとマッチしない) db1=# SELECT regexp_matches('foo/bar/baz', '^([^/]+)(?:/([^/]+))(?:/([^/]+))?$', ''); regexp_matches ---------------- {foo,bar,baz} (1 row) db1=# SELECT regexp_matches('foo/bar/baz', '^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', ''); regexp_matches ---------------- (0 rows)
timezone に +/- 168時間を超える値を指定可能でしたが、タイムゾーン処理時にクラッシュをひき起こしていました。+/- 167 までに制限されるようになります。
(修正前の障害動作例) db1=# SET timezone TO '+300'; SET db1=# SELECT '2015-02-11'::timestamptz; server closed the connection unexpectedly (ここでバックエンドクラッシュ)
語の一致を CRC 計算値のみで判断していたため、偶然 CRC が一致した異なる語があるとき誤った結果が返っていました。
また、右辺の要素の方が多い場合にはマッチしないものとする動作でしたが、語の重複を考慮すると適切な振る舞いではありませんでした。
(以下は修正前バージョンでは f 、修正後バージョンで t となります) db1=# SELECT to_tsquery('aaa,bbb') @> to_tsquery('aaa,bbb,aaa');
行全体の値が空のカラム名を関数に出さないように修正されました。
「SELECT row_to_json(tab.*) ...」などを実行した際に予期せぬエラー「ERROR: record type has not been registered」が生じることがありました。
tableoid などの ctid 以外のシステムカラムについて、リモート側でなく呼び出し側で処理するようになりました。
これまで「Filter: (col = ANY (...))」が有利な場合でも、「Index Cond: (col = ANY (...))」が使われることがあり、修正されました。
なお「col IN (101, 102, 103) 」のような式も「col = ANY ('{101,102,103}'::integer[])」などと変換されて実行されますので該当します。
複合引数を取りインライン展開される SQL関数が、LATERAL 副問い合わせで使われる場合や、その複合引数が LATERAL参照である場合に発生します。
バックエンドクラッシュをひき起こすことがありました。
サイズの大きい要素の投入に対して、無限再帰処理からのバックエンドクラッシュが生じていました。
これまでは、結果としてテーブル毎のこれら設定が無視されていました。本修正により、テーブル毎コスト設定がある場合には、他の autovacuum workerプロセスとは独立に休止の処理が行われるようになり、指定値が反映されます。
本変更により、同じ設定であればより休止が少なくなり、I/O 負荷が以前より高まることになります。
autovacuum = off であっても、XID 周回対策処理が必要であるときには、自動VACUUM が実行される仕様です。このときの対象データベースの全テーブルに通常の自動VACUUM 処理が行われていました。これは、XID 周回の脅威への対応を遅らせることにもなっていました。
本修正により、autovacuum = off であるときには、XID 周回対策処理だけを自動で行うようになりました。
これにより、クラッシュリカバリ後に UNLOGGED テーブルにゴミデータが含まれることを防ぎます。
この不具合はホットスタンバイでのクエリ実行で一時的なエラー、あるいは、誤った実行結果(行の欠損)をもたらすことがありました。
pg_last_xact_replay_timestamp() 関数、recovery_target_xid 設定において 2相コミットの PREPARED 処理の WAL レコードが無視されていました。なお、9.4 系列においては recovery_min_apply_delay 設定でも無視されていましたが、9.4.0 にて既に修正が
適用済みです。
これまでは旧タイムラインのアーカイブからリストアした WALファイルであってもリカバリ時に常に .ready ファイルが作られていました。
9.4.0 リリース前時点の9.4系列で問題が発見され、9.3.6 でも同様の修正が適用されました。
dbname が接続文字列かURIに含まれていた時、予期しない振る舞いをすることがありました。
カーネルの振る舞いに従うと、libpq はサーバが予期せずソケットが閉じたときに有用なエラーを返さずに、空のエラー文字列を返してしまうことがありました。
PQreset() 関数が何度も呼ばれて接続が再確立できなかったとき、失敗した接続によるエラーメッセージは PGconn のエラー文字列に蓄積し続けていました。
これまで接続クライアント側でクラッシュが生じることがありました。
本障害箇所が攻撃に使われる恐れは無いものと考えられます。
以前も空のパスワードファイルである場合には initdb は失敗していましたが、エラーメッセージが明快ではありませんでした。
(以前のメッセージ例) $ initdb -D ./pgdata --pwfile empty.pass The files belonging to this database system will be owned by user "postgres". (中略) initdb: could not read password from file "empty.pass": Success initdb: removing data directory "./pgdata"
readline ではなく libedit でビルドされた psql では、s コマンドによるヒストリ表示がおよそ読めないものでした。
そこで、このライブラリを用いるのではなく、自身でヒストリを表示する方式に修正されました。さらに良い副作用としてページャが使えるようになりました。
本修正で、libedit でコマンドヒストリを保存するとき、改行コードに一貫性がない場合における障害も修正されています。
これまでは設定が無視されていました。
(修正前は以下のように末尾の罫線が不適切でした) $ psql db1 <<'EOS' > pset border 3 > pset linestyle ascii > x > SELECT * FROM t1 ; > EOS [ RECORD 1 ] | id | 1 | | v | AAA | --+----
データベース内に、同一オブジェクト間に多重の依存性経路をもつケースが多くある場合に本修正の効果があらわれます。
--binary-upgrade オプションは pg_upgrade コマンドから使用されます。
pg_upgrade 実行中に OS クラッシュ等が生じた場合にデータ欠損が生じる可能性がありました。
これまでは OID 衝突によって失敗することがありました。
本パラメータは 9.3.3 で追加されたため、9.3.2 までのサーバに対しては、失敗してしまいます。実際のところ設定する必要がないパラメータでした。
この不具合は通常のPostgreSQLに影響するものではありませんが、Slony-I やlondiste などのレプリケーションツールに影響を与える可能性がありました。
バッファオーバーランを防ぐように修正されました。
これにより JSON の数値や文字列が正しく区別できるようになります。
間違ったロジックにより、リレーションの主フォークでないページへのアクセスが妨げられることがありました。
メッセージ長が 65530 バイト (2^16 - 6) や、16378 バイト(2^14 - 6) などの場合に該当します。「Error: Wrong key or corrupt data」が生じていました。なお、メッセージ長が (2^14 x N - 6) N=正整数 の場合に該当するケースも報告されています。
これにより Windows の一時ファイルの削除に失敗することがありました。
これまでの保守的すぎる揮発性指定は、通常利用においては問題ありませんが、最適化と式インデックス利用の妨げとなっていました。本修正では拡張モジュールのバージョン番号は変更されません。
これまでの保守的すぎる揮発性指定は、通常利用においては問題ありませんが、最適化と式インデックス利用の妨げとなっていました。本修正では拡張モジュールのバージョン番号は変更されません。
Windowsプラットフォームで不具合の可能性がありました。
OpenLDAP 2.4.24 から 2.4.31 は、PostgreSQL のバックエンドプロセスをクラッシュさせます。configure で警告を出すとともに、contrib/dblink の回帰テストにクラッシュを引き起こすシナリオを含めるようになりました。
与えられた日付に応じて、タイムゾーン略記法をその日付時点での正しい UTC オフセットに関連付ける動作をするようになります。