[#24112] ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。原因を追求してたのですが、力尽きました。

19 messages 2004/08/18
[#24127] Re: ruby/tk crashes on bcc32 — Hidetoshi NAGAI <nagai@...> 2004/08/19

永井@知能.九工大です.

[#24131] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。

[#24135] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。試行錯誤の結果、これで落ちなくなりました。

[ruby-dev:24066] Re: Zlib::GzipReader#ungetc causes crc error

From: UENO Katsuhiro <unnie@...>
Date: 2004-08-12 09:22:14 UTC
List: ruby-dev #24066
うえのです.

On Thu, 12 Aug 2004 16:46:48 +0900
Tanaka Akira <akr@m17n.org> wrote:

> [ruby-dev:24060] の例はこれで直るのですが、次のような例もあるようです。

これで如何でしょう.

Index: ext/zlib/zlib.c
===================================================================
RCS file: /src/ruby/ext/zlib/zlib.c,v
retrieving revision 1.14
diff -w -u -r1.14 zlib.c
--- ext/zlib/zlib.c	6 Aug 2004 16:00:41 -0000	1.14
+++ ext/zlib/zlib.c	12 Aug 2004 09:03:33 -0000
@@ -119,6 +119,7 @@
 static void gzfile_check_footer _((struct gzfile*));
 static void gzfile_write _((struct gzfile*, Bytef*, uInt));
 static long gzfile_read_more _((struct gzfile*));
+static void gzfile_calc_crc _((struct gzfile*, VALUE));
 static VALUE gzfile_read _((struct gzfile*, int));
 static VALUE gzfile_read_all _((struct gzfile*));
 static void gzfile_ungetc _((struct gzfile*, int));
@@ -2068,6 +2069,21 @@
     return gz->z.buf_filled;
 }
 
+static void
+gzfile_calc_crc(gz, str)
+    struct gzfile *gz;
+    VALUE str;
+{
+    if (RSTRING(str)->len <= gz->ungetc) {
+	gz->ungetc -= RSTRING(str)->len;
+    }
+    else {
+	gz->crc = crc32(gz->crc, RSTRING(str)->ptr + gz->ungetc,
+			RSTRING(str)->len - gz->ungetc);
+	gz->ungetc = 0;
+    }
+}
+
 static VALUE
 gzfile_read(gz, len)
     struct gzfile *gz;
@@ -2090,13 +2106,7 @@
     }
 
     dst = zstream_shift_buffer(&gz->z, len);
-    if (RSTRING(dst)->len <= gz->ungetc) {
-	gz->ungetc -= RSTRING(dst)->len;
-    }
-    else {
-	gz->crc = crc32(gz->crc, RSTRING(dst)->ptr + gz->ungetc,
-			RSTRING(dst)->len - gz->ungetc);
-    }
+    gzfile_calc_crc(gz, dst);
 
     OBJ_TAINT(dst);  /* for safe */
     return dst;
@@ -2119,13 +2129,7 @@
     }
 
     dst = zstream_detach_buffer(&gz->z);
-    if (RSTRING(dst)->len <= gz->ungetc) {
-	gz->ungetc -= RSTRING(dst)->len;
-    }
-    else {
-	gz->crc = crc32(gz->crc, RSTRING(dst)->ptr + gz->ungetc,
-			RSTRING(dst)->len - gz->ungetc);
-    }
+    gzfile_calc_crc(gz, dst);
 
     OBJ_TAINT(dst);  /* for safe */
     return dst;
@@ -3008,8 +3012,7 @@
     while (n++, *(p++) == '\n') {
 	if (n >= gz->z.buf_filled) {
 	    str = zstream_detach_buffer(&gz->z);
-	    gz->crc = crc32(gz->crc, RSTRING(str)->ptr,
-			    RSTRING(str)->len);
+	    gzfile_calc_crc(gz, str);
 	    while (gz->z.buf_filled == 0) {
 		if (GZFILE_IS_FINISHED(gz)) return;
 		gzfile_read_more(gz);
@@ -3020,7 +3023,7 @@
     }
 
     str = zstream_shift_buffer(&gz->z, n - 1);
-    gz->crc = crc32(gz->crc, RSTRING(str)->ptr, RSTRING(str)->len);
+    gzfile_calc_crc(gz, str);
 }
 
 static VALUE


# ツメが甘かったです...



 --  ----  -     - - -- -
うえの かつひろ <unnie@blue.sky.or.jp>

In This Thread