なかだです。

At Fri, 29 Sep 2000 12:50:42 +0900
Takaaki Tateishi <ttate / jaist.ac.jp> wrote:
> まず,iconvのエラーコードとしてE2BIGが返ってきます.このときに
> outlenに(-2)が入っています.このため,output length = 258
> と返ってきてるようでした.そこで,

  E2BIG ということは [ruby-ext:1288] は無関係ですね。

>   char buffer[BUFFSIZE + 10];
>   int  sizeof_buffer = BUFFSIZE
> 
> などのようにバッファを多くしてサイズはそのままにさせると通りは
> しますが,今度は最後のほうで文字が切れているようです.やっぱり
> 途中でoutlenが-2になっていて,その直前のiconvのエラーはE2BIGです.
> 
> 当面の回避策として現在は,バッファサイズに元の文字列の長さの数
> 倍をとっておいてE2BIGがでるのを防ぐという手段をとっています.
> 
> # 再現するCのコード書いてみてSunにも聞いてみます.


  http://www.opengroup.org/onlinepubs/007908799/xsh/iconv.html を見ると
オーバーフローのときも 4 つの引数の指す変数はエラーになる直前の値を保証
する、という風に読めるんですが、どうでしょう。

    If the output buffer is not large enough to hold the entire 
    converted input, conversion stops just prior to the input bytes that 
    would cause the output buffer to overflow. The variable pointed to 
    by inbuf is updated to point to the byte following the last byte 
    successfully used in the conversion. The value pointed to by 
    inbytesleft is decremented to reflect the number of bytes still not 
    converted in the input buffer. The variable pointed to by outbuf is 
    updated to point to the byte following the last byte of converted 
    output data. The value pointed to by outbytesleft is decremented to 
    reflect the number of bytes still available in the output buffer. 

  もし outptr が上記のような値になってるなら添付のパッチでいけるかもしれ
ません。でなければ、E2BIG のときには通るまでバッファを REALLOC() すると
かですね。


--- iconv.c~ Sun Aug 13 13:17:38 2000 +++ iconv.c Fri Sep 29 13:32:39 2000 @@ -244,6 +244,7 @@ error = iconv_try(cd, &inptr, &inlen, &outptr, &outlen); + outlen = outptr - buffer; if (0 <= outlen && outlen <= sizeof(buffer)) { outlen = sizeof(buffer) - outlen; if (outlen > inptr - tmpstart || /* input can't contain output */
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦