[#7631] 1.3 to 1.4 — Katsuyuki Komatsu <komatsu@...>

小松です。

26 messages 1999/08/12
[#7632] Re: 1.3 to 1.4 — matz@... (Yukihiro Matsumoto) 1999/08/12

まつもと ゆきひろです

[#7634] Re: 1.3 to 1.4 — Katsuyuki Komatsu <komatsu@...> 1999/08/13

小松です。

[#7636] Re: 1.3 to 1.4 — matz@... (Yukihiro Matsumoto) 1999/08/13

まつもと ゆきひろです

[#7638] cvs HEAD (Re: Re: 1.3 to 1.4) — EGUCHI Osamu <eguchi@...> 1999/08/13

えぐち@エスアンドイーです。

[#7647] Re: cvs HEAD (Re: Re: 1.3 to 1.4) — matz@... (Yukihiro Matsumoto) 1999/08/13

まつもと ゆきひろです

[#7641] Re: [ruby-ext:00382] New coerce scheme — keiju@... (石塚圭樹)

けいじゅ@日本ラショナルソフトウェアです.

26 messages 1999/08/13

[ruby-dev:7596] Re: make test failure on sunos

From: Katsuyuki Komatsu <komatsu@...>
Date: 1999-08-10 05:27:46 UTC
List: ruby-dev #7596
小松です。

In the message of [ruby-dev:7560] Re: make test failure on sunos 
    on 1999/8/8 18:19:24 Katsuyuki Komatsu <komatsu@sarion.co.jp> wrote:
|スクリプト (test.rb) の指定の仕方が絶対パスだと失敗して
|相対パスだと通るという症状で、
|で作ったものはmake testが通ります。

ここの、絶対パス・相対パスというのは、$0のパス指定の
長さによって症状が変わることを意味しています。
念のため。

% uname -r -s
SunOS 5.5.1
% ./ruby -v
ruby 1.3.7 (1999-08-06) [sparc-solaris2.5.1]
% ./ruby ../sample/./././././././././././test.rb
    ……
end of test(test: 290)
% ./ruby ../sample/././././././././././././test.rb
    ……
not ok string & char 21 -- ../sample/././././././././././././test.rb:618
    ……
test: 290 failed 1
% 

それはともかく、どうやらregex.cの問題のようでp1が
開始位置より前にいってへんな所をアクセスしてしまうから
らしいです。

で、Quick Hackはこんな感じですが、本来どうすべきかはわかりません。
ここに、
    if (p1 < pstart) abort();
とかを入れてデバッグすればいいのかもしれませんが、
ちょっと私の能力を超えています。

--- regex.c-ruby-dev-7583	Mon Aug  9 13:03:26 1999
+++ regex.c	Tue Aug 10 14:15:14 1999
@@ -3288,6 +3288,7 @@ re_match(bufp, string_arg, size, pos, re
   unsigned char *p1;
 
   /* Pointer to beyond end of buffer.  */
+  register unsigned char *pstart = p;
   register unsigned char *pend = p + bufp->used;
 
   unsigned num_regs = bufp->re_nsub;
@@ -4085,7 +4086,7 @@ re_match(bufp, string_arg, size, pos, re
 	  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
 	  p1 += mcnt;
 
-	  if (p1 >= pend) break;
+	  if (p1 < pstart || p1 >= pend) break;
 	  if (( is_a_jump_n && (enum regexpcode)*p1 == succeed_n) ||
 	      (!is_a_jump_n && (enum regexpcode)*p1 == on_failure_jump)) {
 	    if (failed_paren) {

--
小松克行 / Katsuyuki Komatsu <komatsu@sarion.co.jp>

In This Thread