From aa16b1de7d37a451ea966cdc3504fcebf8a5750a Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 28 Dec 2004 04:36:21 +0000 Subject: * ext/zlib/zlib.c (rb_deflate_s_deflate, rb_inflate_s_inflate): ensure freeing internal zstreams. fixed: [ruby-dev:25309] * ext/zlib/zlib.c (rb_deflate_init_copy): replace rb_deflate_clone. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7670 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 ++++++ ext/zlib/zlib.c | 71 ++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index a2a5f2a19e..914a8e6d3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Dec 28 13:35:20 2004 Nobuyoshi Nakada + + * ext/zlib/zlib.c (rb_deflate_s_deflate, rb_inflate_s_inflate): ensure + freeing internal zstreams. fixed: [ruby-dev:25309] + + * ext/zlib/zlib.c (rb_deflate_init_copy): replace rb_deflate_clone. + Tue Dec 28 12:26:45 2004 NAKAMURA Usaku * win32/Makefile.sub, win32/setup.mak (RDOCTARGET, install, diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 1a664fd400..7e4baee889 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -55,7 +55,7 @@ static void zstream_reset_input _((struct zstream*)); static void zstream_passthrough_input _((struct zstream*)); static VALUE zstream_detach_input _((struct zstream*)); static void zstream_reset _((struct zstream*)); -static void zstream_end _((struct zstream*)); +static VALUE zstream_end _((struct zstream*)); static void zstream_run _((struct zstream*, Bytef*, uInt, int)); static VALUE zstream_sync _((struct zstream*, Bytef*, uInt)); static void zstream_mark _((struct zstream*)); @@ -80,7 +80,8 @@ static VALUE rb_zstream_closed_p _((VALUE)); static VALUE rb_deflate_s_allocate _((VALUE)); static VALUE rb_deflate_initialize _((int, VALUE*, VALUE)); -static VALUE rb_deflate_clone _((VALUE)); +static VALUE rb_deflate_init_copy _((VALUE, VALUE)); +static VALUE deflate_run _((VALUE)); static VALUE rb_deflate_s_deflate _((int, VALUE*, VALUE)); static void do_deflate _((struct zstream*, VALUE, int)); static VALUE rb_deflate_deflate _((int, VALUE*, VALUE)); @@ -89,6 +90,7 @@ static VALUE rb_deflate_flush _((int, VALUE*, VALUE)); static VALUE rb_deflate_params _((VALUE, VALUE, VALUE)); static VALUE rb_deflate_set_dictionary _((VALUE, VALUE)); +static VALUE inflate_run _((VALUE)); static VALUE rb_inflate_s_allocate _((VALUE)); static VALUE rb_inflate_initialize _((int, VALUE*, VALUE)); static VALUE rb_inflate_s_inflate _((VALUE, VALUE)); @@ -667,7 +669,7 @@ zstream_reset(z) zstream_reset_input(z); } -static void +static VALUE zstream_end(z) struct zstream *z; { @@ -692,6 +694,7 @@ zstream_end(z) raise_zlib_error(err, z->stream.msg); } z->flags = 0; + return Qnil; } static void @@ -1152,26 +1155,31 @@ rb_deflate_initialize(argc, argv, obj) * Duplicates the deflate stream. */ static VALUE -rb_deflate_clone(obj) - VALUE obj; +rb_deflate_init_copy(self, orig) + VALUE self, orig; { - struct zstream *z = get_zstream(obj); - struct zstream *z2; - VALUE clone; + struct zstream *z1 = get_zstream(self); + struct zstream *z2 = get_zstream(orig); int err; - clone = zstream_deflate_new(rb_class_of(obj)); - Data_Get_Struct(clone, struct zstream, z2); - - err = deflateCopy(&z2->stream, &z->stream); + err = deflateCopy(&z1->stream, &z2->stream); if (err != Z_OK) { raise_zlib_error(err, 0); } + z1->flags = z2->flags; - z2->flags = z->flags; - CLONESETUP(clone, obj); - OBJ_INFECT(clone, obj); - return clone; + return self; +} + +static VALUE +deflate_run(args) + VALUE args; +{ + struct zstream *z = (struct zstream *)((VALUE *)args)[0]; + VALUE src = ((VALUE *)args)[1]; + + zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_FINISH); + return zstream_detach_buffer(z); } /* @@ -1201,7 +1209,7 @@ rb_deflate_s_deflate(argc, argv, klass) VALUE klass; { struct zstream z; - VALUE src, level, dst; + VALUE src, level, dst, args[2]; int err, lev; rb_scan_args(argc, argv, "11", &src, &level); @@ -1215,9 +1223,9 @@ rb_deflate_s_deflate(argc, argv, klass) } ZSTREAM_READY(&z); - zstream_run(&z, RSTRING(src)->ptr, RSTRING(src)->len, Z_FINISH); - dst = zstream_detach_buffer(&z); - zstream_end(&z); + args[0] = (VALUE)&z; + args[1] = src; + dst = rb_ensure(deflate_run, (VALUE)args, zstream_end, (VALUE)&z); OBJ_INFECT(dst, src); return dst; @@ -1430,6 +1438,18 @@ rb_inflate_initialize(argc, argv, obj) return obj; } +static VALUE +inflate_run(args) + VALUE args; +{ + struct zstream *z = (struct zstream *)((VALUE *)args)[0]; + VALUE src = ((VALUE *)args)[1]; + + zstream_run(z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH); + zstream_run(z, "", 0, Z_FINISH); /* for checking errors */ + return zstream_detach_buffer(z); +} + /* * call-seq: Zlib::Inflate.inflate(string) * @@ -1452,7 +1472,7 @@ rb_inflate_s_inflate(obj, src) VALUE obj, src; { struct zstream z; - VALUE dst; + VALUE dst, args[2]; int err; StringValue(src); @@ -1463,10 +1483,9 @@ rb_inflate_s_inflate(obj, src) } ZSTREAM_READY(&z); - zstream_run(&z, RSTRING(src)->ptr, RSTRING(src)->len, Z_SYNC_FLUSH); - zstream_run(&z, "", 0, Z_FINISH); /* for checking errors */ - dst = zstream_detach_buffer(&z); - zstream_end(&z); + args[0] = (VALUE)&z; + args[1] = src; + dst = rb_ensure(inflate_run, (VALUE)args, zstream_end, (VALUE)&z); OBJ_INFECT(dst, src); return dst; @@ -3333,7 +3352,7 @@ void Init_zlib() rb_define_singleton_method(cDeflate, "deflate", rb_deflate_s_deflate, -1); rb_define_alloc_func(cDeflate, rb_deflate_s_allocate); rb_define_method(cDeflate, "initialize", rb_deflate_initialize, -1); - rb_define_method(cDeflate, "clone", rb_deflate_clone, 0); + rb_define_method(cDeflate, "initialize_copy", rb_deflate_init_copy, 0); rb_define_method(cDeflate, "deflate", rb_deflate_deflate, -1); rb_define_method(cDeflate, "<<", rb_deflate_addstr, 1); rb_define_method(cDeflate, "flush", rb_deflate_flush, -1); -- cgit v1.2.3