From: "K.Kosako" Date: 2004-11-19T19:45:57+09:00 Subject: [ruby-dev:24924] [Oniguruma] patch for 3.4.0 3.4.0のimport後、今日までに発見された バグの修正を、一つのパッチに纏めました。 対応した不具合は以下の通りです。 1. [ruby-dev:24802], [ruby-core:3733] PLATFORM_UNALIGNED_WORD_ACCESSでない環境 での致命的バグ 2. [ruby-dev:24859] HP-UX B.11.23 ia64 がmakeに失敗 3. [ruby-dev:24887] "a".gsub(/a\Z/, "")がSEGV 4. よしだむネット 2004/11/11 UTF-8の文字クラス test_regexp.rbへの追加も添付します。 -- 小迫@ソフネック 渋谷区恵比寿1-15-1 --- test_regexp.rb 2004-10-30 08:22:57.000000000 +0900 +++ /home/kosako/oniguruma/test_regexp.rb 2004-11-19 17:36:57.000000000 +0900 @@ -8,4 +8,20 @@ class TestRegexp < Test::Unit::TestCase def test_ruby_talk_116455 assert_match(/^(\w{2,}).* ([A-Za-z\xa2\xc0-\xff]{2,}?)$/, "Hallo Welt") end + + def test_ruby_dev_24887 + assert_equal("a".gsub(/a\Z/, ""), "") + end + + def test_yoshidam_net_20041111_1 + s = "[\xC2\xA0-\xC3\xBE]" + assert_match(Regexp.new(s, nil, "u"), "\xC3\xBE") + end + + def test_yoshidam_net_20041111_2 + assert_raise(RegexpError) do + s = "[\xFF-\xFF]" + Regexp.new(s, nil, "u") + end + end end Index: regcomp.c =================================================================== RCS file: /home/kosako/cvsrep/oniguruma/regcomp.c,v retrieving revision 1.6 diff -r1.6 regcomp.c 161d160 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 163,167d161 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_RELADDR(ra, buf); < BBUF_ADD(reg, buf, SIZE_RELADDR); < #endif 176d169 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 178,182d170 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_ABSADDR(ra, buf); < BBUF_ADD(reg, buf, SIZE_ABSADDR); < #endif 191d178 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 193,197d179 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_LENGTH(l, buf); < BBUF_ADD(reg, buf, SIZE_LENGTH); < #endif 206d187 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 208,212d188 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_MEMNUM(n, buf); < BBUF_ADD(reg, buf, SIZE_MEMNUM); < #endif 222d197 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 224,228d198 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_REPEATNUM(n, buf); < BBUF_ADD(reg, buf, SIZE_REPEATNUM); < #endif 236d205 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 238,242d206 < #else < UChar buf[SERIALIZE_BUFSIZE]; < SERIALIZE_OPTION(option, buf); < BBUF_ADD(reg, buf, SIZE_OPTION); < #endif 1640,1642d1603 < #ifndef PLATFORM_UNALIGNED_WORD_ACCESS < UChar buf[SERIALIZE_BUFSIZE]; < #endif 1650d1610 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 1652,1655d1611 < #else < SERIALIZE_ABSADDR(addr, buf); < BBUF_WRITE(reg, offset, buf, SIZE_ABSADDR); < #endif 5128,5129c5084 < addr = *((RelAddrType* )bp); < bp += SIZE_RELADDR; --- > GET_RELADDR_INC(addr, bp); Index: regexec.c =================================================================== RCS file: /home/kosako/cvsrep/oniguruma/regexec.c,v retrieving revision 1.9 diff -r1.9 regexec.c 3202c3202 < UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, start, end, 1); --- > UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, str, end, 1); Index: regint.h =================================================================== RCS file: /home/kosako/cvsrep/oniguruma/regint.h,v retrieving revision 1.6 diff -r1.6 regint.h 583,597d582 < #ifdef PLATFORM_UNALIGNED_WORD_ACCESS < #define GET_RELADDR_INC(addr,p) do{\ < addr = *((RelAddrType* )(p));\ < (p) += SIZE_RELADDR;\ < } while(0) < < #define GET_ABSADDR_INC(addr,p) do{\ < addr = *((AbsAddrType* )(p));\ < (p) += SIZE_ABSADDR;\ < } while(0) < < #define GET_LENGTH_INC(len,p) do{\ < len = *((LengthType* )(p));\ < (p) += SIZE_LENGTH;\ < } while(0) 599,602d583 < #define GET_MEMNUM_INC(num,p) do{\ < num = *((MemNumType* )(p));\ < (p) += SIZE_MEMNUM;\ < } while(0) 604,607c585 < #define GET_REPEATNUM_INC(num,p) do{\ < num = *((RepeatNumType* )(p));\ < (p) += SIZE_REPEATNUM;\ < } while(0) --- > #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 609,611c587,589 < #define GET_OPTION_INC(option,p) do{\ < option = *((OnigOptionType* )(p));\ < (p) += SIZE_OPTION;\ --- > #define PLATFORM_GET_INC(val,p,type) do{\ > val = *(type* )p;\ > (p) += sizeof(type);\ 616,630c594,597 < #define GET_RELADDR_INC(addr,p) GET_SHORT_INC(addr,p) < #define GET_ABSADDR_INC(addr,p) GET_SHORT_INC(addr,p) < #define GET_LENGTH_INC(len,p) GET_SHORT_INC(len,p) < #define GET_MEMNUM_INC(num,p) GET_SHORT_INC(num,p) < #define GET_REPEATNUM_INC(num,p) GET_INT_INC(num,p) < #define GET_OPTION_INC(option,p) GET_UINT_INC(option,p) < < #define SERIALIZE_RELADDR(addr,p) SERIALIZE_SHORT(addr,p) < #define SERIALIZE_ABSADDR(addr,p) SERIALIZE_SHORT(addr,p) < #define SERIALIZE_LENGTH(len,p) SERIALIZE_SHORT(len,p) < #define SERIALIZE_MEMNUM(num,p) SERIALIZE_SHORT(num,p) < #define SERIALIZE_REPEATNUM(num,p) SERIALIZE_INT(num,p) < #define SERIALIZE_OPTION(option,p) SERIALIZE_UINT(option,p) < < #define SERIALIZE_BUFSIZE SIZEOF_INT --- > #define PLATFORM_GET_INC(val,p,type) do{\ > xmemcpy(&val, (p), sizeof(type));\ > (p) += sizeof(type);\ > } while(0) 632a600,606 > > #define GET_RELADDR_INC(addr,p) PLATFORM_GET_INC(addr, p, RelAddrType) > #define GET_ABSADDR_INC(addr,p) PLATFORM_GET_INC(addr, p, AbsAddrType) > #define GET_LENGTH_INC(len,p) PLATFORM_GET_INC(len, p, LengthType) > #define GET_MEMNUM_INC(num,p) PLATFORM_GET_INC(num, p, MemNumType) > #define GET_REPEATNUM_INC(num,p) PLATFORM_GET_INC(num, p, RepeatNumType) > #define GET_OPTION_INC(option,p) PLATFORM_GET_INC(option, p, OnigOptionType) Index: regparse.c =================================================================== RCS file: /home/kosako/cvsrep/oniguruma/regparse.c,v retrieving revision 1.6 diff -r1.6 regparse.c 3633a3634,3636 > if (*vs > 0xff || v > 0xff) > return ONIGERR_INVALID_WIDE_CHAR_VALUE; > 3649,3655d3651 < if (intype == CCV_CODE_POINT && *type == CCV_SB && < ONIGENC_IS_CONTINUOUS_SB_MB(env->enc)) { < bitset_set_range(cc->bs, (int )*vs, 0x7f); < r = add_code_range(&(cc->mbuf), env, (OnigCodePoint )0x80, v); < if (r < 0) return r; < } < #else 3656a3653 > #endif 3665a3663 > #if 0 3667d3664 < #endif 3669a3667 > #endif 3829c3827 < v = tok->u.code; --- > v = (OnigCodePoint )tok->u.code; 3955c3953 < r = next_state_val(cc, &vs, 0, &val_israw, 0, CCV_SB, --- > r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type, 3995c3993 < r = next_state_val(cc, &vs, 0, &val_israw, 0, CCV_SB, --- > r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type,