象と戯れ

 | 

2011-01-12

psqlがクラッシュする話

02:15 | psqlがクラッシュする話 - 象と戯れ を含むブックマーク はてなブックマーク - psqlがクラッシュする話 - 象と戯れ

少なくとも8.4と開発中のソースでpsqlがこけるのでパッチを送りました。

initdbしてpostgresql.confのclient_encodingをshift_jisに修正、postgresプロセスを起動し下記の内容を保存したsqlファイルをpsql -f で読ませます。

CREATE TABLE category_master(
  category_code char(11) NOT NULL -- 分類
);

但し、ファイルエンコーディングをUTF8(BOMなし)、改行コードをLFとします。

エンコーディングが異なっているので動作しないのは当然としても、クラッシュするのは直しておこうということで原因調査したところパッチは2行でした。

diff --git a/src/bin/psql/psqlscan.l b/src/bin/psql/psqlscan.l
index 3575f91..218d7e0 100644
--- a/src/bin/psql/psqlscan.l
+++ b/src/bin/psql/psqlscan.l
@@ -1775,7 +1775,8 @@ prepare_buffer(const char *txt, int len, char **txtcopy)
 			/* first byte should always be okay... */
 			newtxt[i] = txt[i];
 			i++;
-			while (--thislen > 0)
+			/* thislen might be greater than len, so double-check */
+			while (--thislen > 0 && i < len)
 				newtxt[i++] = (char) 0xFF;
 		}
 	}

thislenが想定より大きい値を返すのでiがオーバーフローしてたたけなんですね。もっとイカツいバグかと思って意気込んでしまったアルよ。

client_encoding = shift_jisは忘れられゆく存在だろうしそもそもエンコーディング間違えるなよということでどうでもいいケースでしょうけれども、たまにはこうしてブログでも書かないとと思った次第です。

本体の開発は着々と進んでいて、いつのまにやらbasebackupやらレプリケーション用のシステムカタログが入ったり入らなかったり、Unlogged TableとかいうGlobal Temporary Table的なやつとかも入っていたり相変わらずSQL/MEDは進んでいるしMULTISETとかも動きがありそうで地味に進行している様子。キャッチアップ遅れまくり。

開発系だけでなく良くあるトラブルケースとかの話も書きたいのですがそれはまた今度。

 |