よしだです

TAKAHASHI Masayoshi <maki / inac.co.jp> writes:
> ・XMLParserでUTF-16LE&CR+LFの文書をファイルオブジェクトの形で
>   parseすると落ちる(原因はexpat?)。

expat みたいです。以下のプログラムでも落ちてしまいます。


#include "expat.h"

int
main()
{
  XML_Parser parser;
  const char xml1[] =  "\377\376<\0a\0>\0\r\0\n";
  const char xml2[] = "\0<\0/\0a\0>\0\r\0\n";
  const char xml3[] = "\0";

  parser = XML_ParserCreate(NULL);
  XML_Parse(parser, xml1, sizeof(xml1) - 1, 0);
  XML_Parse(parser, xml2, sizeof(xml2) - 1, 0);
  XML_Parse(parser, xml3, sizeof(xml3) - 1, 1);
  XML_ParserFree(parser);

  return 0;
}

文字列の終端を飛び越えてしまうようです。

diff -ur expat-1.95.2.org/lib/xmltok_impl.c expat-1.95.2/lib/xmltok_impl.c
--- expat-1.95.2.org/lib/xmltok_impl.c	Sat Jul 28 05:33:34 2001
+++ expat-1.95.2/lib/xmltok_impl.c	Fri Nov 30 21:48:41 2001
@@ -1731,7 +1731,7 @@
 			    const char *end,
 			    POSITION *pos)
 {
-  while (ptr != end) {
+  while (ptr < end) {
     switch (BYTE_TYPE(enc, ptr)) {
 #define LEAD_CASE(n) \
     case BT_LEAD ## n: \


> ・その前に、XMLParserの「getsメソッドがあるオブジェクトの場合、
>   行ごとに読み込んでparseする」という仕様は、素朴に行なうと
>   UTF-16 Little-Endian の場合に(16bitの)コードユニットを分断して
>   しまうことになるが、それは構わないのか構うのか?  構うなら
>   どうするべきか?

expat は(今回のバグが無ければ)コードユニットが分断してもパー
スできるはずです。1 バイトずつパースしても問題ないはず。

ちょっと気持ち悪いのは確かです。でも read で固定バイトを読ん
でも,サロゲートペアの分断が起こる可能性はありますよね。

-- 
    吉田正人
    yoshidam / yoshidam.net
    yoshidam / andesu.to