zlib 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +3 -2
  3. data/README.md +1 -1
  4. data/ext/zlib/zlib.c +156 -125
  5. data/zlib.gemspec +12 -2
  6. metadata +3 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e2d28dc0bcac8345db3a2f65229fc3ac5d3130e7
4
- data.tar.gz: 23ac52950f8d7417ad3505300fb706a908eeda97
2
+ SHA256:
3
+ metadata.gz: 19ba8efdb32fca21018696b5c7c2daf46ac6be20d4eeac8c084bdd416f36d97a
4
+ data.tar.gz: c8aa54b4af9ced56c043853a85c948f736030a6d1cc1b2bd3693164d0a9b944c
5
5
  SHA512:
6
- metadata.gz: fb489611bdaf16c1c20804d28fae2c3f28c0a9a5a9cecc54996cad555653d447a74060ed087b0edfe186fc8de06de65d61b93fe657f8ed8c5364329606061193
7
- data.tar.gz: 10f5154d4e3f5f085b2aa32cb4d933842fc528892ed671031e9b35e818f0af9d427b0187de43d44c1b59873fef8dc4c8441ca431f3de78c0e25f6a2aa80503d0
6
+ metadata.gz: fad984e401f53eba898295296b1a8dfaf7f5035c60c2e720501f03871ba3ba617167d093e6d17c4075bca2da2e838445367d0271fca7bff549ed3a8e0cc33a6b
7
+ data.tar.gz: 2b59bdabdba6fa6a09c31dc1ba1fe01110ef4ed775c41e8f386091ab547a874f5398603437817a66641ce99f2d083cbdf515a339765da7c615d648080ba1abdd
@@ -1,7 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.5
5
- - 2.4.2
4
+ - 2.3.6
5
+ - 2.4.3
6
+ - 2.5.0
6
7
  - ruby-head
7
8
  before_install: gem install bundler
data/README.md CHANGED
@@ -34,7 +34,7 @@ Or install it yourself as:
34
34
 
35
35
  Using the wrapper to compress strings with default parameters is quite simple:
36
36
 
37
- ```
37
+ ```ruby
38
38
  require "zlib"
39
39
 
40
40
  data_to_compress = File.read("don_quixote.txt")
@@ -25,7 +25,11 @@
25
25
  # define VALGRIND_MAKE_MEM_UNDEFINED(p, n) 0
26
26
  #endif
27
27
 
28
- #define RUBY_ZLIB_VERSION "0.6.0"
28
+ #define RUBY_ZLIB_VERSION "1.1.0"
29
+
30
+ #ifndef RB_PASS_CALLED_KEYWORDS
31
+ # define rb_class_new_instance_kw(argc, argv, klass, kw_splat) rb_class_new_instance(argc, argv, klass)
32
+ #endif
29
33
 
30
34
  #ifndef GZIP_SUPPORT
31
35
  #define GZIP_SUPPORT 1
@@ -85,6 +89,7 @@ static void zstream_passthrough_input(struct zstream*);
85
89
  static VALUE zstream_detach_input(struct zstream*);
86
90
  static void zstream_reset(struct zstream*);
87
91
  static VALUE zstream_end(struct zstream*);
92
+ static VALUE zstream_ensure_end(VALUE v);
88
93
  static void zstream_run(struct zstream*, Bytef*, long, int);
89
94
  static VALUE zstream_sync(struct zstream*, Bytef*, long);
90
95
  static void zstream_mark(void*);
@@ -140,19 +145,19 @@ static void gzfile_reset(struct gzfile*);
140
145
  static void gzfile_close(struct gzfile*, int);
141
146
  static void gzfile_write_raw(struct gzfile*);
142
147
  static VALUE gzfile_read_raw_partial(VALUE);
143
- static VALUE gzfile_read_raw_rescue(VALUE);
144
- static VALUE gzfile_read_raw(struct gzfile*);
145
- static int gzfile_read_raw_ensure(struct gzfile*, long);
148
+ static VALUE gzfile_read_raw_rescue(VALUE,VALUE);
149
+ static VALUE gzfile_read_raw(struct gzfile*, VALUE outbuf);
150
+ static int gzfile_read_raw_ensure(struct gzfile*, long, VALUE outbuf);
146
151
  static char *gzfile_read_raw_until_zero(struct gzfile*, long);
147
152
  static unsigned int gzfile_get16(const unsigned char*);
148
153
  static unsigned long gzfile_get32(const unsigned char*);
149
154
  static void gzfile_set32(unsigned long n, unsigned char*);
150
155
  static void gzfile_make_header(struct gzfile*);
151
156
  static void gzfile_make_footer(struct gzfile*);
152
- static void gzfile_read_header(struct gzfile*);
153
- static void gzfile_check_footer(struct gzfile*);
157
+ static void gzfile_read_header(struct gzfile*, VALUE outbuf);
158
+ static void gzfile_check_footer(struct gzfile*, VALUE outbuf);
154
159
  static void gzfile_write(struct gzfile*, Bytef*, long);
155
- static long gzfile_read_more(struct gzfile*);
160
+ static long gzfile_read_more(struct gzfile*, VALUE outbuf);
156
161
  static void gzfile_calc_crc(struct gzfile*, VALUE);
157
162
  static VALUE gzfile_read(struct gzfile*, long);
158
163
  static VALUE gzfile_read_all(struct gzfile*);
@@ -360,11 +365,7 @@ finalizer_warn(const char *msg)
360
365
  static VALUE
361
366
  rb_zlib_version(VALUE klass)
362
367
  {
363
- VALUE str;
364
-
365
- str = rb_str_new2(zlibVersion());
366
- OBJ_TAINT(str); /* for safe */
367
- return str;
368
+ return rb_str_new2(zlibVersion());
368
369
  }
369
370
 
370
371
  #if SIZEOF_LONG > SIZEOF_INT
@@ -627,10 +628,8 @@ zstream_expand_buffer(struct zstream *z)
627
628
  long buf_filled = ZSTREAM_BUF_FILLED(z);
628
629
  if (buf_filled >= ZSTREAM_AVAIL_OUT_STEP_MAX) {
629
630
  int state = 0;
630
- VALUE self = (VALUE)z->stream.opaque;
631
631
 
632
632
  rb_obj_reveal(z->buf, rb_cString);
633
- OBJ_INFECT(z->buf, self);
634
633
 
635
634
  rb_protect(rb_yield, z->buf, &state);
636
635
 
@@ -738,7 +737,7 @@ zstream_append_buffer(struct zstream *z, const Bytef *src, long len)
738
737
  static VALUE
739
738
  zstream_detach_buffer(struct zstream *z)
740
739
  {
741
- VALUE dst, self = (VALUE)z->stream.opaque;
740
+ VALUE dst;
742
741
 
743
742
  if (!ZSTREAM_IS_FINISHED(z) && !ZSTREAM_IS_GZFILE(z) &&
744
743
  rb_block_given_p()) {
@@ -755,8 +754,6 @@ zstream_detach_buffer(struct zstream *z)
755
754
  rb_obj_reveal(dst, rb_cString);
756
755
  }
757
756
 
758
- OBJ_INFECT(dst, self);
759
-
760
757
  z->buf = Qnil;
761
758
  z->stream.next_out = 0;
762
759
  z->stream.avail_out = 0;
@@ -845,19 +842,50 @@ zstream_append_input(struct zstream *z, const Bytef *src, long len)
845
842
  static void
846
843
  zstream_discard_input(struct zstream *z, long len)
847
844
  {
848
- if (NIL_P(z->input) || RSTRING_LEN(z->input) <= len) {
849
- z->input = Qnil;
845
+ if (NIL_P(z->input)) {
850
846
  }
851
- else {
852
- z->input = rb_str_substr(z->input, len,
853
- RSTRING_LEN(z->input) - len);
847
+ else if (RBASIC_CLASS(z->input) == 0) {
848
+ /* hidden, we created z->input and have complete control */
849
+ char *ptr;
850
+ long oldlen, newlen;
851
+
852
+ RSTRING_GETMEM(z->input, ptr, oldlen);
853
+ newlen = oldlen - len;
854
+ if (newlen > 0) {
855
+ memmove(ptr, ptr + len, newlen);
856
+ }
857
+ if (newlen < 0) {
858
+ newlen = 0;
859
+ }
860
+ rb_str_resize(z->input, newlen);
861
+ if (newlen == 0) {
862
+ rb_gc_force_recycle(z->input);
863
+ z->input = Qnil;
864
+ }
865
+ else {
866
+ rb_str_set_len(z->input, newlen);
867
+ }
868
+ }
869
+ else { /* do not mangle user-provided data */
870
+ if (RSTRING_LEN(z->input) <= len) {
871
+ z->input = Qnil;
872
+ }
873
+ else {
874
+ z->input = rb_str_substr(z->input, len,
875
+ RSTRING_LEN(z->input) - len);
876
+ }
854
877
  }
855
878
  }
856
879
 
857
880
  static void
858
881
  zstream_reset_input(struct zstream *z)
859
882
  {
860
- z->input = Qnil;
883
+ if (!NIL_P(z->input) && RBASIC_CLASS(z->input) == 0) {
884
+ rb_str_resize(z->input, 0);
885
+ }
886
+ else {
887
+ z->input = Qnil;
888
+ }
861
889
  }
862
890
 
863
891
  static void
@@ -882,7 +910,6 @@ zstream_detach_input(struct zstream *z)
882
910
  rb_obj_reveal(dst, rb_cString);
883
911
  }
884
912
  z->input = Qnil;
885
- rb_obj_reveal(dst, rb_cString);
886
913
  return dst;
887
914
  }
888
915
 
@@ -925,6 +952,12 @@ zstream_end(struct zstream *z)
925
952
  return Qnil;
926
953
  }
927
954
 
955
+ static VALUE
956
+ zstream_ensure_end(VALUE v)
957
+ {
958
+ return zstream_end((struct zstream *)v);
959
+ }
960
+
928
961
  static void *
929
962
  zstream_run_func(void *ptr)
930
963
  {
@@ -981,6 +1014,7 @@ zstream_run_func(void *ptr)
981
1014
 
982
1015
  /*
983
1016
  * There is no safe way to interrupt z->run->func().
1017
+ * async-signal-safe
984
1018
  */
985
1019
  static void
986
1020
  zstream_unblock_func(void *ptr)
@@ -995,7 +1029,7 @@ zstream_run(struct zstream *z, Bytef *src, long len, int flush)
995
1029
  {
996
1030
  struct zstream_run_args args;
997
1031
  int err;
998
- VALUE guard = Qnil;
1032
+ VALUE old_input = Qnil;
999
1033
 
1000
1034
  args.z = z;
1001
1035
  args.flush = flush;
@@ -1009,12 +1043,13 @@ zstream_run(struct zstream *z, Bytef *src, long len, int flush)
1009
1043
  }
1010
1044
  else {
1011
1045
  zstream_append_input(z, src, len);
1012
- z->stream.next_in = (Bytef*)RSTRING_PTR(z->input);
1013
- z->stream.avail_in = MAX_UINT(RSTRING_LEN(z->input));
1014
1046
  /* keep reference to `z->input' so as not to be garbage collected
1015
1047
  after zstream_reset_input() and prevent `z->stream.next_in'
1016
1048
  from dangling. */
1017
- guard = z->input;
1049
+ old_input = zstream_detach_input(z);
1050
+ rb_obj_hide(old_input); /* for GVL release and later recycle */
1051
+ z->stream.next_in = (Bytef*)RSTRING_PTR(old_input);
1052
+ z->stream.avail_in = MAX_UINT(RSTRING_LEN(old_input));
1018
1053
  }
1019
1054
 
1020
1055
  if (z->stream.avail_out == 0) {
@@ -1022,8 +1057,14 @@ zstream_run(struct zstream *z, Bytef *src, long len, int flush)
1022
1057
  }
1023
1058
 
1024
1059
  loop:
1060
+ #ifndef RB_NOGVL_UBF_ASYNC_SAFE
1025
1061
  err = (int)(VALUE)rb_thread_call_without_gvl(zstream_run_func, (void *)&args,
1026
1062
  zstream_unblock_func, (void *)&args);
1063
+ #else
1064
+ err = (int)(VALUE)rb_nogvl(zstream_run_func, (void *)&args,
1065
+ zstream_unblock_func, (void *)&args,
1066
+ RB_NOGVL_UBF_ASYNC_SAFE);
1067
+ #endif
1027
1068
 
1028
1069
  if (flush != Z_FINISH && err == Z_BUF_ERROR
1029
1070
  && z->stream.avail_out > 0) {
@@ -1052,7 +1093,10 @@ loop:
1052
1093
 
1053
1094
  if (z->stream.avail_in > 0) {
1054
1095
  zstream_append_input(z, z->stream.next_in, z->stream.avail_in);
1055
- RB_GC_GUARD(guard); /* prevent tail call to make guard effective */
1096
+ }
1097
+ if (!NIL_P(old_input)) {
1098
+ rb_str_resize(old_input, 0);
1099
+ rb_gc_force_recycle(old_input);
1056
1100
  }
1057
1101
 
1058
1102
  if (args.jump_state)
@@ -1285,7 +1329,6 @@ rb_zstream_flush_next_in(VALUE obj)
1285
1329
 
1286
1330
  TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
1287
1331
  dst = zstream_detach_input(z);
1288
- OBJ_INFECT(dst, obj);
1289
1332
  return dst;
1290
1333
  }
1291
1334
 
@@ -1604,9 +1647,8 @@ rb_deflate_s_deflate(int argc, VALUE *argv, VALUE klass)
1604
1647
 
1605
1648
  args[0] = (VALUE)&z;
1606
1649
  args[1] = src;
1607
- dst = rb_ensure(deflate_run, (VALUE)args, zstream_end, (VALUE)&z);
1650
+ dst = rb_ensure(deflate_run, (VALUE)args, zstream_ensure_end, (VALUE)&z);
1608
1651
 
1609
- OBJ_INFECT(dst, src);
1610
1652
  return dst;
1611
1653
  }
1612
1654
 
@@ -1656,7 +1698,6 @@ rb_deflate_deflate(int argc, VALUE *argv, VALUE obj)
1656
1698
  VALUE src, flush;
1657
1699
 
1658
1700
  rb_scan_args(argc, argv, "11", &src, &flush);
1659
- OBJ_INFECT(obj, src);
1660
1701
  do_deflate(z, src, ARG_FLUSH(flush));
1661
1702
 
1662
1703
  return zstream_detach_buffer(z);
@@ -1674,7 +1715,6 @@ rb_deflate_deflate(int argc, VALUE *argv, VALUE obj)
1674
1715
  static VALUE
1675
1716
  rb_deflate_addstr(VALUE obj, VALUE src)
1676
1717
  {
1677
- OBJ_INFECT(obj, src);
1678
1718
  do_deflate(get_zstream(obj), src, Z_NO_FLUSH);
1679
1719
  return obj;
1680
1720
  }
@@ -1774,7 +1814,6 @@ rb_deflate_set_dictionary(VALUE obj, VALUE dic)
1774
1814
  VALUE src = dic;
1775
1815
  int err;
1776
1816
 
1777
- OBJ_INFECT(obj, dic);
1778
1817
  StringValue(src);
1779
1818
  err = deflateSetDictionary(&z->stream,
1780
1819
  (Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src));
@@ -1919,9 +1958,8 @@ rb_inflate_s_inflate(VALUE obj, VALUE src)
1919
1958
 
1920
1959
  args[0] = (VALUE)&z;
1921
1960
  args[1] = src;
1922
- dst = rb_ensure(inflate_run, (VALUE)args, zstream_end, (VALUE)&z);
1961
+ dst = rb_ensure(inflate_run, (VALUE)args, zstream_ensure_end, (VALUE)&z);
1923
1962
 
1924
- OBJ_INFECT(dst, src);
1925
1963
  return dst;
1926
1964
  }
1927
1965
 
@@ -2001,8 +2039,6 @@ rb_inflate_inflate(VALUE obj, VALUE src)
2001
2039
  struct zstream *z = get_zstream(obj);
2002
2040
  VALUE dst;
2003
2041
 
2004
- OBJ_INFECT(obj, src);
2005
-
2006
2042
  if (ZSTREAM_IS_FINISHED(z)) {
2007
2043
  if (NIL_P(src)) {
2008
2044
  dst = zstream_detach_buffer(z);
@@ -2011,7 +2047,6 @@ rb_inflate_inflate(VALUE obj, VALUE src)
2011
2047
  StringValue(src);
2012
2048
  zstream_append_buffer2(z, src);
2013
2049
  dst = rb_str_new(0, 0);
2014
- OBJ_INFECT(dst, obj);
2015
2050
  }
2016
2051
  }
2017
2052
  else {
@@ -2037,8 +2072,6 @@ rb_inflate_addstr(VALUE obj, VALUE src)
2037
2072
  {
2038
2073
  struct zstream *z = get_zstream(obj);
2039
2074
 
2040
- OBJ_INFECT(obj, src);
2041
-
2042
2075
  if (ZSTREAM_IS_FINISHED(z)) {
2043
2076
  if (!NIL_P(src)) {
2044
2077
  StringValue(src);
@@ -2068,7 +2101,6 @@ rb_inflate_sync(VALUE obj, VALUE src)
2068
2101
  {
2069
2102
  struct zstream *z = get_zstream(obj);
2070
2103
 
2071
- OBJ_INFECT(obj, src);
2072
2104
  StringValue(src);
2073
2105
  return zstream_sync(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src));
2074
2106
  }
@@ -2110,7 +2142,6 @@ rb_inflate_set_dictionary(VALUE obj, VALUE dic)
2110
2142
  VALUE src = dic;
2111
2143
  int err;
2112
2144
 
2113
- OBJ_INFECT(obj, dic);
2114
2145
  StringValue(src);
2115
2146
  err = inflateSetDictionary(&z->stream,
2116
2147
  (Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src));
@@ -2191,7 +2222,6 @@ struct gzfile {
2191
2222
  rb_encoding *enc2;
2192
2223
  rb_econv_t *ec;
2193
2224
  VALUE ecopts;
2194
- char *cbuf;
2195
2225
  VALUE path;
2196
2226
  };
2197
2227
  #define GZFILE_CBUF_CAPA 10
@@ -2199,12 +2229,23 @@ struct gzfile {
2199
2229
  #define GZFILE_FLAG_SYNC ZSTREAM_FLAG_UNUSED
2200
2230
  #define GZFILE_FLAG_HEADER_FINISHED (ZSTREAM_FLAG_UNUSED << 1)
2201
2231
  #define GZFILE_FLAG_FOOTER_FINISHED (ZSTREAM_FLAG_UNUSED << 2)
2232
+ #define GZFILE_FLAG_MTIME_IS_SET (ZSTREAM_FLAG_UNUSED << 3)
2202
2233
 
2203
2234
  #define GZFILE_IS_FINISHED(gz) \
2204
2235
  (ZSTREAM_IS_FINISHED(&(gz)->z) && ZSTREAM_BUF_FILLED(&(gz)->z) == 0)
2205
2236
 
2206
2237
  #define GZFILE_READ_SIZE 2048
2207
2238
 
2239
+ struct read_raw_arg {
2240
+ VALUE io;
2241
+ union {
2242
+ const VALUE argv[2]; /* for rb_funcallv */
2243
+ struct {
2244
+ VALUE len;
2245
+ VALUE buf;
2246
+ } in;
2247
+ } as;
2248
+ };
2208
2249
 
2209
2250
  static void
2210
2251
  gzfile_mark(void *p)
@@ -2231,22 +2272,13 @@ gzfile_free(void *p)
2231
2272
  }
2232
2273
  zstream_finalize(z);
2233
2274
  }
2234
- if (gz->cbuf) {
2235
- xfree(gz->cbuf);
2236
- }
2237
2275
  xfree(gz);
2238
2276
  }
2239
2277
 
2240
2278
  static size_t
2241
2279
  gzfile_memsize(const void *p)
2242
2280
  {
2243
- const struct gzfile *gz = p;
2244
- size_t size = sizeof(struct gzfile);
2245
-
2246
- if (gz->cbuf)
2247
- size += GZFILE_CBUF_CAPA;
2248
-
2249
- return size;
2281
+ return sizeof(struct gzfile);
2250
2282
  }
2251
2283
 
2252
2284
  static const rb_data_type_t gzfile_data_type = {
@@ -2275,7 +2307,6 @@ gzfile_init(struct gzfile *gz, const struct zstream_funcs *funcs, void (*endfunc
2275
2307
  gz->ec = NULL;
2276
2308
  gz->ecflags = 0;
2277
2309
  gz->ecopts = Qnil;
2278
- gz->cbuf = 0;
2279
2310
  gz->path = Qnil;
2280
2311
  }
2281
2312
 
@@ -2329,7 +2360,6 @@ gzfile_write_raw(struct gzfile *gz)
2329
2360
 
2330
2361
  if (ZSTREAM_BUF_FILLED(&gz->z) > 0) {
2331
2362
  str = zstream_detach_buffer(&gz->z);
2332
- OBJ_TAINT(str); /* for safe */
2333
2363
  rb_funcall(gz->io, id_write, 1, str);
2334
2364
  if ((gz->z.flags & GZFILE_FLAG_SYNC)
2335
2365
  && rb_respond_to(gz->io, id_flush))
@@ -2340,21 +2370,23 @@ gzfile_write_raw(struct gzfile *gz)
2340
2370
  static VALUE
2341
2371
  gzfile_read_raw_partial(VALUE arg)
2342
2372
  {
2343
- struct gzfile *gz = (struct gzfile*)arg;
2373
+ struct read_raw_arg *ra = (struct read_raw_arg *)arg;
2344
2374
  VALUE str;
2375
+ int argc = NIL_P(ra->as.argv[1]) ? 1 : 2;
2345
2376
 
2346
- str = rb_funcall(gz->io, id_readpartial, 1, INT2FIX(GZFILE_READ_SIZE));
2377
+ str = rb_funcallv(ra->io, id_readpartial, argc, ra->as.argv);
2347
2378
  Check_Type(str, T_STRING);
2348
2379
  return str;
2349
2380
  }
2350
2381
 
2351
2382
  static VALUE
2352
- gzfile_read_raw_rescue(VALUE arg)
2383
+ gzfile_read_raw_rescue(VALUE arg, VALUE _)
2353
2384
  {
2354
- struct gzfile *gz = (struct gzfile*)arg;
2385
+ struct read_raw_arg *ra = (struct read_raw_arg *)arg;
2355
2386
  VALUE str = Qnil;
2356
2387
  if (rb_obj_is_kind_of(rb_errinfo(), rb_eNoMethodError)) {
2357
- str = rb_funcall(gz->io, id_read, 1, INT2FIX(GZFILE_READ_SIZE));
2388
+ int argc = NIL_P(ra->as.argv[1]) ? 1 : 2;
2389
+ str = rb_funcallv(ra->io, id_read, argc, ra->as.argv);
2358
2390
  if (!NIL_P(str)) {
2359
2391
  Check_Type(str, T_STRING);
2360
2392
  }
@@ -2363,15 +2395,21 @@ gzfile_read_raw_rescue(VALUE arg)
2363
2395
  }
2364
2396
 
2365
2397
  static VALUE
2366
- gzfile_read_raw(struct gzfile *gz)
2398
+ gzfile_read_raw(struct gzfile *gz, VALUE outbuf)
2367
2399
  {
2368
- return rb_rescue2(gzfile_read_raw_partial, (VALUE)gz,
2369
- gzfile_read_raw_rescue, (VALUE)gz,
2400
+ struct read_raw_arg ra;
2401
+
2402
+ ra.io = gz->io;
2403
+ ra.as.in.len = INT2FIX(GZFILE_READ_SIZE);
2404
+ ra.as.in.buf = outbuf;
2405
+
2406
+ return rb_rescue2(gzfile_read_raw_partial, (VALUE)&ra,
2407
+ gzfile_read_raw_rescue, (VALUE)&ra,
2370
2408
  rb_eEOFError, rb_eNoMethodError, (VALUE)0);
2371
2409
  }
2372
2410
 
2373
2411
  static int
2374
- gzfile_read_raw_ensure(struct gzfile *gz, long size)
2412
+ gzfile_read_raw_ensure(struct gzfile *gz, long size, VALUE outbuf)
2375
2413
  {
2376
2414
  VALUE str;
2377
2415
 
@@ -2380,7 +2418,7 @@ gzfile_read_raw_ensure(struct gzfile *gz, long size)
2380
2418
  rb_raise(cGzError, "unexpected end of string");
2381
2419
  }
2382
2420
  while (NIL_P(gz->z.input) || RSTRING_LEN(gz->z.input) < size) {
2383
- str = gzfile_read_raw(gz);
2421
+ str = gzfile_read_raw(gz, outbuf);
2384
2422
  if (NIL_P(str)) return 0;
2385
2423
  zstream_append_input2(&gz->z, str);
2386
2424
  }
@@ -2397,7 +2435,7 @@ gzfile_read_raw_until_zero(struct gzfile *gz, long offset)
2397
2435
  p = memchr(RSTRING_PTR(gz->z.input) + offset, '\0',
2398
2436
  RSTRING_LEN(gz->z.input) - offset);
2399
2437
  if (p) break;
2400
- str = gzfile_read_raw(gz);
2438
+ str = gzfile_read_raw(gz, Qnil);
2401
2439
  if (NIL_P(str)) {
2402
2440
  rb_raise(cGzError, "unexpected end of file");
2403
2441
  }
@@ -2478,7 +2516,7 @@ gzfile_make_header(struct gzfile *gz)
2478
2516
  if (!NIL_P(gz->comment)) {
2479
2517
  flags |= GZ_FLAG_COMMENT;
2480
2518
  }
2481
- if (gz->mtime == 0) {
2519
+ if (!(gz->z.flags & GZFILE_FLAG_MTIME_IS_SET)) {
2482
2520
  gz->mtime = time(0);
2483
2521
  }
2484
2522
 
@@ -2522,13 +2560,14 @@ gzfile_make_footer(struct gzfile *gz)
2522
2560
  }
2523
2561
 
2524
2562
  static void
2525
- gzfile_read_header(struct gzfile *gz)
2563
+ gzfile_read_header(struct gzfile *gz, VALUE outbuf)
2526
2564
  {
2527
2565
  const unsigned char *head;
2528
2566
  long len;
2529
2567
  char flags, *p;
2530
2568
 
2531
- if (!gzfile_read_raw_ensure(gz, 10)) { /* 10 is the size of gzip header */
2569
+ /* 10 is the size of gzip header */
2570
+ if (!gzfile_read_raw_ensure(gz, 10, outbuf)) {
2532
2571
  gzfile_raise(gz, cGzError, "not in gzip format");
2533
2572
  }
2534
2573
 
@@ -2567,33 +2606,31 @@ gzfile_read_header(struct gzfile *gz)
2567
2606
  zstream_discard_input(&gz->z, 10);
2568
2607
 
2569
2608
  if (flags & GZ_FLAG_EXTRA) {
2570
- if (!gzfile_read_raw_ensure(gz, 2)) {
2609
+ if (!gzfile_read_raw_ensure(gz, 2, outbuf)) {
2571
2610
  rb_raise(cGzError, "unexpected end of file");
2572
2611
  }
2573
2612
  len = gzfile_get16((Bytef*)RSTRING_PTR(gz->z.input));
2574
- if (!gzfile_read_raw_ensure(gz, 2 + len)) {
2613
+ if (!gzfile_read_raw_ensure(gz, 2 + len, outbuf)) {
2575
2614
  rb_raise(cGzError, "unexpected end of file");
2576
2615
  }
2577
2616
  zstream_discard_input(&gz->z, 2 + len);
2578
2617
  }
2579
2618
  if (flags & GZ_FLAG_ORIG_NAME) {
2580
- if (!gzfile_read_raw_ensure(gz, 1)) {
2619
+ if (!gzfile_read_raw_ensure(gz, 1, outbuf)) {
2581
2620
  rb_raise(cGzError, "unexpected end of file");
2582
2621
  }
2583
2622
  p = gzfile_read_raw_until_zero(gz, 0);
2584
2623
  len = p - RSTRING_PTR(gz->z.input);
2585
2624
  gz->orig_name = rb_str_new(RSTRING_PTR(gz->z.input), len);
2586
- OBJ_TAINT(gz->orig_name); /* for safe */
2587
2625
  zstream_discard_input(&gz->z, len + 1);
2588
2626
  }
2589
2627
  if (flags & GZ_FLAG_COMMENT) {
2590
- if (!gzfile_read_raw_ensure(gz, 1)) {
2628
+ if (!gzfile_read_raw_ensure(gz, 1, outbuf)) {
2591
2629
  rb_raise(cGzError, "unexpected end of file");
2592
2630
  }
2593
2631
  p = gzfile_read_raw_until_zero(gz, 0);
2594
2632
  len = p - RSTRING_PTR(gz->z.input);
2595
2633
  gz->comment = rb_str_new(RSTRING_PTR(gz->z.input), len);
2596
- OBJ_TAINT(gz->comment); /* for safe */
2597
2634
  zstream_discard_input(&gz->z, len + 1);
2598
2635
  }
2599
2636
 
@@ -2603,13 +2640,14 @@ gzfile_read_header(struct gzfile *gz)
2603
2640
  }
2604
2641
 
2605
2642
  static void
2606
- gzfile_check_footer(struct gzfile *gz)
2643
+ gzfile_check_footer(struct gzfile *gz, VALUE outbuf)
2607
2644
  {
2608
2645
  unsigned long crc, length;
2609
2646
 
2610
2647
  gz->z.flags |= GZFILE_FLAG_FOOTER_FINISHED;
2611
2648
 
2612
- if (!gzfile_read_raw_ensure(gz, 8)) { /* 8 is the size of gzip footer */
2649
+ /* 8 is the size of gzip footer */
2650
+ if (!gzfile_read_raw_ensure(gz, 8, outbuf)) {
2613
2651
  gzfile_raise(gz, cNoFooter, "footer is not found");
2614
2652
  }
2615
2653
 
@@ -2643,12 +2681,12 @@ gzfile_write(struct gzfile *gz, Bytef *str, long len)
2643
2681
  }
2644
2682
 
2645
2683
  static long
2646
- gzfile_read_more(struct gzfile *gz)
2684
+ gzfile_read_more(struct gzfile *gz, VALUE outbuf)
2647
2685
  {
2648
2686
  VALUE str;
2649
2687
 
2650
2688
  while (!ZSTREAM_IS_FINISHED(&gz->z)) {
2651
- str = gzfile_read_raw(gz);
2689
+ str = gzfile_read_raw(gz, outbuf);
2652
2690
  if (NIL_P(str)) {
2653
2691
  if (!ZSTREAM_IS_FINISHED(&gz->z)) {
2654
2692
  rb_raise(cGzError, "unexpected end of file");
@@ -2683,13 +2721,11 @@ gzfile_newstr(struct gzfile *gz, VALUE str)
2683
2721
  {
2684
2722
  if (!gz->enc2) {
2685
2723
  rb_enc_associate(str, gz->enc);
2686
- OBJ_TAINT(str); /* for safe */
2687
2724
  return str;
2688
2725
  }
2689
2726
  if (gz->ec && rb_enc_dummy_p(gz->enc2)) {
2690
2727
  str = rb_econv_str_convert(gz->ec, str, ECONV_PARTIAL_INPUT);
2691
2728
  rb_enc_associate(str, gz->enc);
2692
- OBJ_TAINT(str);
2693
2729
  return str;
2694
2730
  }
2695
2731
  return rb_str_conv_enc_opts(str, gz->enc2, gz->enc,
@@ -2704,11 +2740,11 @@ gzfile_fill(struct gzfile *gz, long len)
2704
2740
  if (len == 0)
2705
2741
  return 0;
2706
2742
  while (!ZSTREAM_IS_FINISHED(&gz->z) && ZSTREAM_BUF_FILLED(&gz->z) < len) {
2707
- gzfile_read_more(gz);
2743
+ gzfile_read_more(gz, Qnil);
2708
2744
  }
2709
2745
  if (GZFILE_IS_FINISHED(gz)) {
2710
2746
  if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2711
- gzfile_check_footer(gz);
2747
+ gzfile_check_footer(gz, Qnil);
2712
2748
  }
2713
2749
  return -1;
2714
2750
  }
@@ -2736,9 +2772,6 @@ gzfile_readpartial(struct gzfile *gz, long len, VALUE outbuf)
2736
2772
  if (len < 0)
2737
2773
  rb_raise(rb_eArgError, "negative length %ld given", len);
2738
2774
 
2739
- if (!NIL_P(outbuf))
2740
- OBJ_TAINT(outbuf);
2741
-
2742
2775
  if (len == 0) {
2743
2776
  if (NIL_P(outbuf))
2744
2777
  return rb_str_new(0, 0);
@@ -2748,11 +2781,11 @@ gzfile_readpartial(struct gzfile *gz, long len, VALUE outbuf)
2748
2781
  }
2749
2782
  }
2750
2783
  while (!ZSTREAM_IS_FINISHED(&gz->z) && ZSTREAM_BUF_FILLED(&gz->z) == 0) {
2751
- gzfile_read_more(gz);
2784
+ gzfile_read_more(gz, outbuf);
2752
2785
  }
2753
2786
  if (GZFILE_IS_FINISHED(gz)) {
2754
2787
  if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2755
- gzfile_check_footer(gz);
2788
+ gzfile_check_footer(gz, outbuf);
2756
2789
  }
2757
2790
  if (!NIL_P(outbuf))
2758
2791
  rb_str_resize(outbuf, 0);
@@ -2765,10 +2798,10 @@ gzfile_readpartial(struct gzfile *gz, long len, VALUE outbuf)
2765
2798
  if (!NIL_P(outbuf)) {
2766
2799
  rb_str_resize(outbuf, RSTRING_LEN(dst));
2767
2800
  memcpy(RSTRING_PTR(outbuf), RSTRING_PTR(dst), RSTRING_LEN(dst));
2768
- RB_GC_GUARD(dst);
2801
+ rb_str_resize(dst, 0);
2802
+ rb_gc_force_recycle(dst);
2769
2803
  dst = outbuf;
2770
2804
  }
2771
- OBJ_TAINT(dst); /* for safe */
2772
2805
  return dst;
2773
2806
  }
2774
2807
 
@@ -2778,11 +2811,11 @@ gzfile_read_all(struct gzfile *gz)
2778
2811
  VALUE dst;
2779
2812
 
2780
2813
  while (!ZSTREAM_IS_FINISHED(&gz->z)) {
2781
- gzfile_read_more(gz);
2814
+ gzfile_read_more(gz, Qnil);
2782
2815
  }
2783
2816
  if (GZFILE_IS_FINISHED(gz)) {
2784
2817
  if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2785
- gzfile_check_footer(gz);
2818
+ gzfile_check_footer(gz, Qnil);
2786
2819
  }
2787
2820
  return rb_str_new(0, 0);
2788
2821
  }
@@ -2790,7 +2823,6 @@ gzfile_read_all(struct gzfile *gz)
2790
2823
  dst = zstream_detach_buffer(&gz->z);
2791
2824
  if (NIL_P(dst)) return dst;
2792
2825
  gzfile_calc_crc(gz, dst);
2793
- OBJ_TAINT(dst);
2794
2826
  return gzfile_newstr(gz, dst);
2795
2827
  }
2796
2828
 
@@ -2802,11 +2834,11 @@ gzfile_getc(struct gzfile *gz)
2802
2834
 
2803
2835
  len = rb_enc_mbmaxlen(gz->enc);
2804
2836
  while (!ZSTREAM_IS_FINISHED(&gz->z) && ZSTREAM_BUF_FILLED(&gz->z) < len) {
2805
- gzfile_read_more(gz);
2837
+ gzfile_read_more(gz, Qnil);
2806
2838
  }
2807
2839
  if (GZFILE_IS_FINISHED(gz)) {
2808
2840
  if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2809
- gzfile_check_footer(gz);
2841
+ gzfile_check_footer(gz, Qnil);
2810
2842
  }
2811
2843
  return Qnil;
2812
2844
  }
@@ -2814,22 +2846,18 @@ gzfile_getc(struct gzfile *gz)
2814
2846
  if (gz->ec && rb_enc_dummy_p(gz->enc2)) {
2815
2847
  const unsigned char *ss, *sp, *se;
2816
2848
  unsigned char *ds, *dp, *de;
2849
+ VALUE cbuf = rb_enc_str_new(0, GZFILE_CBUF_CAPA, gz->enc);
2817
2850
 
2818
- if (!gz->cbuf) {
2819
- gz->cbuf = ALLOC_N(char, GZFILE_CBUF_CAPA);
2820
- }
2821
2851
  ss = sp = (const unsigned char*)RSTRING_PTR(gz->z.buf);
2822
2852
  se = sp + ZSTREAM_BUF_FILLED(&gz->z);
2823
- ds = dp = (unsigned char *)gz->cbuf;
2853
+ ds = dp = (unsigned char *)RSTRING_PTR(cbuf);
2824
2854
  de = (unsigned char *)ds + GZFILE_CBUF_CAPA;
2825
2855
  (void)rb_econv_convert(gz->ec, &sp, se, &dp, de, ECONV_PARTIAL_INPUT|ECONV_AFTER_OUTPUT);
2826
2856
  rb_econv_check_error(gz->ec);
2827
2857
  dst = zstream_shift_buffer(&gz->z, sp - ss);
2828
2858
  gzfile_calc_crc(gz, dst);
2829
- dst = rb_str_new(gz->cbuf, dp - ds);
2830
- rb_enc_associate(dst, gz->enc);
2831
- OBJ_TAINT(dst);
2832
- return dst;
2859
+ rb_str_resize(cbuf, dp - ds);
2860
+ return cbuf;
2833
2861
  }
2834
2862
  else {
2835
2863
  buf = gz->z.buf;
@@ -2876,7 +2904,7 @@ gzfile_writer_end(struct gzfile *gz)
2876
2904
  if (ZSTREAM_IS_CLOSING(&gz->z)) return;
2877
2905
  gz->z.flags |= ZSTREAM_FLAG_CLOSING;
2878
2906
 
2879
- rb_ensure(gzfile_writer_end_run, (VALUE)gz, zstream_end, (VALUE)&gz->z);
2907
+ rb_ensure(gzfile_writer_end_run, (VALUE)gz, zstream_ensure_end, (VALUE)&gz->z);
2880
2908
  }
2881
2909
 
2882
2910
  static VALUE
@@ -2886,7 +2914,7 @@ gzfile_reader_end_run(VALUE arg)
2886
2914
 
2887
2915
  if (GZFILE_IS_FINISHED(gz)
2888
2916
  && !(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2889
- gzfile_check_footer(gz);
2917
+ gzfile_check_footer(gz, Qnil);
2890
2918
  }
2891
2919
 
2892
2920
  return Qnil;
@@ -2898,7 +2926,7 @@ gzfile_reader_end(struct gzfile *gz)
2898
2926
  if (ZSTREAM_IS_CLOSING(&gz->z)) return;
2899
2927
  gz->z.flags |= ZSTREAM_FLAG_CLOSING;
2900
2928
 
2901
- rb_ensure(gzfile_reader_end_run, (VALUE)gz, zstream_end, (VALUE)&gz->z);
2929
+ rb_ensure(gzfile_reader_end_run, (VALUE)gz, zstream_ensure_end, (VALUE)&gz->z);
2902
2930
  }
2903
2931
 
2904
2932
  static void
@@ -2923,12 +2951,11 @@ gzfile_reader_get_unused(struct gzfile *gz)
2923
2951
  if (!ZSTREAM_IS_READY(&gz->z)) return Qnil;
2924
2952
  if (!GZFILE_IS_FINISHED(gz)) return Qnil;
2925
2953
  if (!(gz->z.flags & GZFILE_FLAG_FOOTER_FINISHED)) {
2926
- gzfile_check_footer(gz);
2954
+ gzfile_check_footer(gz, Qnil);
2927
2955
  }
2928
2956
  if (NIL_P(gz->z.input)) return Qnil;
2929
2957
 
2930
2958
  str = rb_str_resurrect(gz->z.input);
2931
- OBJ_TAINT(str); /* for safe */
2932
2959
  return str;
2933
2960
  }
2934
2961
 
@@ -2995,7 +3022,7 @@ static VALUE
2995
3022
  new_wrap(VALUE tmp)
2996
3023
  {
2997
3024
  new_wrap_arg_t *arg = (new_wrap_arg_t *)tmp;
2998
- return rb_class_new_instance(arg->argc, arg->argv, arg->klass);
3025
+ return rb_class_new_instance_kw(arg->argc, arg->argv, arg->klass, RB_PASS_CALLED_KEYWORDS);
2999
3026
  }
3000
3027
 
3001
3028
  static VALUE
@@ -3028,7 +3055,7 @@ gzfile_wrap(int argc, VALUE *argv, VALUE klass, int close_io_on_error)
3028
3055
  }
3029
3056
  }
3030
3057
  else {
3031
- obj = rb_class_new_instance(argc, argv, klass);
3058
+ obj = rb_class_new_instance_kw(argc, argv, klass, RB_PASS_CALLED_KEYWORDS);
3032
3059
  }
3033
3060
 
3034
3061
  if (rb_block_given_p()) {
@@ -3145,7 +3172,6 @@ rb_gzfile_orig_name(VALUE obj)
3145
3172
  if (!NIL_P(str)) {
3146
3173
  str = rb_str_dup(str);
3147
3174
  }
3148
- OBJ_TAINT(str); /* for safe */
3149
3175
  return str;
3150
3176
  }
3151
3177
 
@@ -3162,7 +3188,6 @@ rb_gzfile_comment(VALUE obj)
3162
3188
  if (!NIL_P(str)) {
3163
3189
  str = rb_str_dup(str);
3164
3190
  }
3165
- OBJ_TAINT(str); /* for safe */
3166
3191
  return str;
3167
3192
  }
3168
3193
 
@@ -3221,6 +3246,7 @@ rb_gzfile_set_mtime(VALUE obj, VALUE mtime)
3221
3246
 
3222
3247
  val = rb_Integer(mtime);
3223
3248
  gz->mtime = NUM2UINT(val);
3249
+ gz->z.flags |= GZFILE_FLAG_MTIME_IS_SET;
3224
3250
 
3225
3251
  return mtime;
3226
3252
  }
@@ -3731,7 +3757,7 @@ rb_gzreader_initialize(int argc, VALUE *argv, VALUE obj)
3731
3757
  }
3732
3758
  gz->io = io;
3733
3759
  ZSTREAM_READY(&gz->z);
3734
- gzfile_read_header(gz);
3760
+ gzfile_read_header(gz, Qnil);
3735
3761
  rb_gzfile_ecopts(gz, opt);
3736
3762
 
3737
3763
  if (rb_respond_to(io, id_path)) {
@@ -3981,7 +4007,7 @@ gzreader_skip_linebreaks(struct gzfile *gz)
3981
4007
 
3982
4008
  while (ZSTREAM_BUF_FILLED(&gz->z) == 0) {
3983
4009
  if (GZFILE_IS_FINISHED(gz)) return;
3984
- gzfile_read_more(gz);
4010
+ gzfile_read_more(gz, Qnil);
3985
4011
  }
3986
4012
  n = 0;
3987
4013
  p = RSTRING_PTR(gz->z.buf);
@@ -3992,7 +4018,7 @@ gzreader_skip_linebreaks(struct gzfile *gz)
3992
4018
  gzfile_calc_crc(gz, str);
3993
4019
  while (ZSTREAM_BUF_FILLED(&gz->z) == 0) {
3994
4020
  if (GZFILE_IS_FINISHED(gz)) return;
3995
- gzfile_read_more(gz);
4021
+ gzfile_read_more(gz, Qnil);
3996
4022
  }
3997
4023
  n = 0;
3998
4024
  p = RSTRING_PTR(gz->z.buf);
@@ -4114,7 +4140,7 @@ gzreader_gets(int argc, VALUE *argv, VALUE obj)
4114
4140
  if (ZSTREAM_BUF_FILLED(&gz->z) > 0) gz->lineno++;
4115
4141
  return gzfile_read(gz, rslen);
4116
4142
  }
4117
- gzfile_read_more(gz);
4143
+ gzfile_read_more(gz, Qnil);
4118
4144
  }
4119
4145
 
4120
4146
  p = RSTRING_PTR(gz->z.buf);
@@ -4123,7 +4149,7 @@ gzreader_gets(int argc, VALUE *argv, VALUE obj)
4123
4149
  long filled;
4124
4150
  if (n > ZSTREAM_BUF_FILLED(&gz->z)) {
4125
4151
  if (ZSTREAM_IS_FINISHED(&gz->z)) break;
4126
- gzfile_read_more(gz);
4152
+ gzfile_read_more(gz, Qnil);
4127
4153
  p = RSTRING_PTR(gz->z.buf) + n - rslen;
4128
4154
  }
4129
4155
  if (!rspara) rscheck(rsptr, rslen, rs);
@@ -4251,13 +4277,19 @@ rb_gzreader_external_encoding(VALUE self)
4251
4277
  }
4252
4278
 
4253
4279
  static VALUE
4254
- zlib_gzip_ensure(VALUE arg)
4280
+ zlib_gzip_end_rescue(VALUE arg)
4255
4281
  {
4256
4282
  struct gzfile *gz = (struct gzfile *)arg;
4257
- rb_rescue((VALUE(*)())gz->end, arg, NULL, Qnil);
4283
+ gz->end(gz);
4258
4284
  return Qnil;
4259
4285
  }
4260
4286
 
4287
+ static VALUE
4288
+ zlib_gzip_ensure(VALUE arg)
4289
+ {
4290
+ return rb_rescue(zlib_gzip_end_rescue, arg, NULL, Qnil);
4291
+ }
4292
+
4261
4293
  static void
4262
4294
  zlib_gzip_end(struct gzfile *gz)
4263
4295
  {
@@ -4403,7 +4435,7 @@ zlib_gunzip_run(VALUE arg)
4403
4435
  struct gzfile *gz = (struct gzfile *)arg;
4404
4436
  VALUE dst;
4405
4437
 
4406
- gzfile_read_header(gz);
4438
+ gzfile_read_header(gz, Qnil);
4407
4439
  dst = zstream_detach_buffer(&gz->z);
4408
4440
  gzfile_calc_crc(gz, dst);
4409
4441
  if (!ZSTREAM_IS_FINISHED(&gz->z)) {
@@ -4412,7 +4444,7 @@ zlib_gunzip_run(VALUE arg)
4412
4444
  if (NIL_P(gz->z.input)) {
4413
4445
  rb_raise(cNoFooter, "footer is not found");
4414
4446
  }
4415
- gzfile_check_footer(gz);
4447
+ gzfile_check_footer(gz, Qnil);
4416
4448
  return dst;
4417
4449
  }
4418
4450
 
@@ -4421,6 +4453,7 @@ zlib_gunzip_run(VALUE arg)
4421
4453
  void
4422
4454
  Init_zlib(void)
4423
4455
  {
4456
+ #undef rb_intern
4424
4457
  VALUE mZlib, cZStream, cDeflate, cInflate;
4425
4458
  #if GZIP_SUPPORT
4426
4459
  VALUE cGzipFile, cGzipWriter, cGzipReader;
@@ -4844,5 +4877,3 @@ Init_zlib(void)
4844
4877
  * Raised when the data length recorded in the gzip file footer is not equivalent
4845
4878
  * to the length of the actual uncompressed data.
4846
4879
  */
4847
-
4848
-
@@ -1,9 +1,19 @@
1
1
  # coding: utf-8
2
2
  # frozen_string_literal: true
3
+
4
+ source_version = ["", "ext/zlib/"].find do |dir|
5
+ begin
6
+ break File.open(File.join(__dir__, "#{dir}zlib.c")) {|f|
7
+ f.gets("\n#define RUBY_ZLIB_VERSION ")
8
+ f.gets[/\s*"(.+)"/, 1]
9
+ }
10
+ rescue Errno::ENOENT
11
+ end
12
+ end
13
+
3
14
  Gem::Specification.new do |spec|
4
15
  spec.name = "zlib"
5
- spec.version = "1.0.0"
6
- spec.date = '2017-12-11'
16
+ spec.version = source_version
7
17
  spec.authors = ["Yukihiro Matsumoto", "UENO Katsuhiro"]
8
18
  spec.email = ["matz@ruby-lang.org", nil]
9
19
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zlib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yukihiro Matsumoto
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-12-11 00:00:00.000000000 Z
12
+ date: 2019-11-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -92,8 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.5.2.1
95
+ rubygems_version: 3.0.3
97
96
  signing_key:
98
97
  specification_version: 4
99
98
  summary: Ruby interface for the zlib compression/decompression library