[pgpool-general-jp: 1147] Re: 拡張問い合わせプロトコルでセグメンテーションフォルト
Tatsuo Ishii
ishii @ sraoss.co.jp
2013年 3月 14日 (木) 19:36:29 JST
安西様
SRA OSS石井です。
解析とパッチのご提供、ありがとうございます。確認させていただきます。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
> 安西と申します。
>
> pgpool-II 3.1.6にて、レプリケーションモードで拡張問い合わせ
> プロトコルを使用したトランザクションを実行中に、子プロセスが
> SIGSEGVで落ちる現象が発生しました。
>
> 添付のsegv.sql内に記載されているクエリを実行することで、
> 発生します。(INSERT,SELECTをより多く繰り返さないと発生しない
> 可能性もあります。)
>
> 調査したところ、Parse処理中のnow()の書き換え処理を行う部分で、
> 不正な処理と思われる箇所を発見いたしました。
>
> pool_proto_modules.c:L774
>
> ---
> rewrite_query = rewrite_timestamp(backend, node, rewrite_to_params,
> msg);
> if (rewrite_query != NULL)
> {
> int alloc_len = len - strlen(stmt) + strlen(rewrite_query);
> ★contents = palloc(alloc_len);
> strcpy(contents, name);
>
> (略)
>
> ●msg->contents = contents;
> ---
>
> msg->contentsには元々pool_create_sent_messageでセッション
> コンテキストで管理しているメモリを割り当てています。
> ★印のpallocはクエリコンテキストのメモリを割り当てており、
> ●印の箇所でセッションコンテキストの管理する領域にクエリ
> コンテキストのメモリが格納されます。
>
> msg->contentsのメモリチャンクはクエリ処理終了後にセッション
> コンテキストのメモリプールに戻され、再利用されるかと思います。
> また、クエリコンテキストのメモリチャンクはクエリ処理終了後に
> ブロックごと削除(free)されるかと思います。
>
> そのため●の影響によって、セッションコンテキストのメモリ
> プールに戻されたメモリチャンクがクエリコンテキストの
> 削除によってfreeされ、そのメモリチャンクをセッション
> コンテキストで再利用するタイミングで問題が発生するようです。
>
> 本障害が発生する条件は最低でも以下の4つがあります。
>
> ・レプリケーションモード
> ・拡張問い合わせプロトコル
> ・更新系クエリでnow()等を含むクエリを発行
> ・同一セッションで複数のクエリを発行
>
> 本現象は3.0.5 , 3.1.4 , 3.2.3でも発生することを確認しています。
>
> 修正パッチを作成してみましたので、ご確認いただければと思います。
>
>
> 以上、よろしくお願い致します。
>
> -----------------------------------------------------------
> NECソフト株式会社
> PFシステム事業部 テーマソフトウェアG
> 安西 直也
>
> 外線:(03)5534-2353 内線:8-57-40364
> E-mail:anzai-naoya @ mxu.nes.nec.co.jp
> -----------------------------------------------------------
pgpool-general-jp メーリングリストの案内