[Senna-dev 797] Re: sen_snip_open()でSEN_SNIP_COPY_TAGフラグを指定してもdefaultタグが複製されない

Back to archive index

Akihiro YAMANOI a.yam****@gmail*****
2008年 3月 4日 (火) 12:50:13 JST


山野井です。
末永さん、ご返信どうもありがとうございます。

SEN_SNIP_COPY_TAGは内部利用のためのフラグでしたか!
このフラグが正式に使えると、バインディング開発などで
文字列管理の手間が減り便利だと思います。
正式対応が楽しみです。

ありがとうございました。


Tasuku SUENAGA<a****@razil*****> さんは書きました:
> 末永です。
>
> SEN_SNIP_COPY_TAGは内部利用のため設定したフラグですが、
> 確かに外部から利用できたら嬉しいですよね。
> (特に各種言語バインディング開発では便利だと思います)
> 正式に対応したいと思います!!
>
> Akihiro YAMANOI さんは書きました:
> > 山野井です。
> > sen_snip_open()関数のバグ報告です。Senna-1.1.1で追加された
> > SEN_SNIP_COPY_TAGフラグを指定した際の挙動に関してです。
> >
> > [発生した環境]
> > ・CPU: VIA C3
> > ・メモリ容量: 512MB
> > ・ハードディスク容量: 160GB(空き100GB)
> > ・OS: CentOS4.4
> > ・uname -aの結果: Linux localhost.localdomain 2.6.9-42.0.10.EL #1 Tue Feb
> > 27 09:24:42 EST 2007 i686 i686 i386 GNU/Linux
> > ・Senna: 1.1.1
> > ・gcc: 3.4.6
> >
> > [起こっている問題]
> > sen_snip_open()関数は、flags引数にSEN_SNIP_COPY_TAGフラグを指定しても
> > defaultopentag及びdefaultclosetagを複製せずに保持します。
> > (lib/snip.c:388行目辺り)
> >
> > しかし、sen_snip_close()関数は、SEN_SNIP_COPY_TAGフラグが立っている場合
> > 保持しているdefaultopentag及びdefaultclosetagに対しSEN_FREE()を呼びます。
> > (lib/snip.c:432行目辺り)
> >
> > 上記が原因で、senna外部で確保した変数が意図せず解放されてしまいます。
> >
> >
> > [再現方法1]
> > char *openTag = calloc(9, sizeof(char));
> > memcpy(openTag, "<strong>", 8);
> > openTag[8] = '\0';
> >
> > sen_snip *snip = sen_snip_open(
> >       sen_enc_utf8, SEN_SNIP_COPY_TAG,
> >       100, 1,
> >       openTag, strlen(openTag),
> >       NULL, 0,
> >       NULL
> > );
> > sen_snip_close(snip);
> > free(openTag);
> > ----
> > (実行結果)
> > セグメンテーション違反です。
> > ----
> > と表示されました。呼び出し側で確保した文字列変数openTagが
> > sen_snip_close()内部で解放されてしまい、呼び出し側のfree()は
> > エラーになります。
> >
> >
> > [再現方法2]
> > char *openTag = calloc(9, sizeof(char));
> > memcpy(openTag, "<strong>", 8);
> > openTag[8] = '\0';
> >
> > sen_snip *snip = sen_snip_open(
> >       sen_enc_utf8, SEN_SNIP_COPY_TAG,
> >       100, 1,
> >       openTag, strlen(openTag),
> >       openTag, strlen(openTag), /* 同じ変数を与える */
> >       NULL
> > );
> > sen_snip_close(snip);
> > ----
> > (実行結果)
> > *** glibc detected *** double free or corruption (fasttop): 0x0a5b8c48 ***
> > アボートしました
> > ----
> > と表示されました。sen_snip_close()内部でopenTag変数が2重に
> > 解放されてエラーが発生します。
> >
> >
> > sen_snip_close()にデフォルトタグ文字列の解放処理が記述されていましたので、
> > sen_snip_open()内で文字列を複製していないのは不具合なのではと思い、ご報告
> > させて頂きました。
> >
> > バグではなく仕様上あえてこうなっていましたら、上記報告は私の勘違いです!
> > ご確認頂けると嬉しいです。
> >
> > よろしくお願いいたします。
> ---
> Tasuku SUENAGA <a****@razil*****>




Senna-dev メーリングリストの案内
Back to archive index