minitar 0.6.1 → 0.7
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.
- checksums.yaml +5 -5
- data/Contributing.md +4 -0
- data/History.md +28 -0
- data/README.rdoc +34 -3
- data/lib/archive/tar/minitar.rb +3 -1
- data/lib/archive/tar/minitar/posix_header.rb +18 -3
- data/lib/archive/tar/minitar/reader.rb +5 -1
- data/lib/archive/tar/minitar/writer.rb +23 -19
- data/test/test_tar_header.rb +15 -0
- data/test/test_tar_output.rb +7 -14
- data/test/test_tar_reader.rb +10 -0
- data/test/test_tar_writer.rb +17 -14
- metadata +13 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fe4dcb6889d7dd3e767dc3329f8e874d4359577f219b0a76df859617a253c4fb
|
4
|
+
data.tar.gz: 345a765b717201d0a47dbb4d52572d68d51797fb41f7df0f314e9a43b160e6de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: faf3628dd94d2a9f85c86a7662b8699911d022d5b7e75ea2f41effd6fd896252721e953203796cd99739f7c9e756066250d78e613ee606271d79c36753836df2
|
7
|
+
data.tar.gz: b0311f7166e41805adce3709c53a0acda7dcfe5b732abb16d278706b5e54b56cb2477e3e51bc0bf8d5f6143e61421fd11860a3e1fca22c57ea405f751fa8b369
|
data/Contributing.md
CHANGED
@@ -78,6 +78,10 @@ Thanks to everyone who has contributed to minitar:
|
|
78
78
|
* Mike Furr
|
79
79
|
* Pete Fritchman
|
80
80
|
* Zach Dennis
|
81
|
+
* ooooooo\_q
|
82
|
+
* Kazuyoshi Kato
|
83
|
+
* dearblue
|
84
|
+
* Kevin McDermott
|
81
85
|
|
82
86
|
[Minitest]: https://github.com/seattlerb/minitest
|
83
87
|
[quality commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
data/History.md
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
## 0.7 / 2018-02-19
|
2
|
+
|
3
|
+
* Fixed issue [#28][] with a modified version of PR [#29][] covering the
|
4
|
+
security policy and position for Minitar. Thanks so much to ooooooo\_q for
|
5
|
+
the report and an initial patch. Additional information was added as
|
6
|
+
[#30][].
|
7
|
+
|
8
|
+
* dearblue contributed PR [#33][] providing a fix for Minitar::Reader when
|
9
|
+
the IO-like object does not have a `#pos` method.
|
10
|
+
|
11
|
+
* Kevin McDermott contributed PR [#34][] so that an InvalidTarStream is
|
12
|
+
raised if the tar header is not valid, preventing incorrect streaming of
|
13
|
+
files from a non-tarfile. This is a minor breaking change, so the version
|
14
|
+
has been bumped accordingly.
|
15
|
+
|
16
|
+
* Kazuyoshi Kato contributed PR [#26][] providing support for the GNU tar
|
17
|
+
long filename extension.
|
18
|
+
|
19
|
+
* Addressed a potential DOS with negative size fields in tar headers
|
20
|
+
([#31][]). This has been handled in two ways: the size field in a tar
|
21
|
+
header is interpreted as a strict octal value and the Minitar reader will
|
22
|
+
raise an InvalidTarStream if the size ends up being negative anyway.
|
23
|
+
|
1
24
|
## 0.6.1 / 2017-02-07
|
2
25
|
|
3
26
|
* Fixed issue [#24][] where streams were being improperly closed immediately
|
@@ -115,3 +138,8 @@
|
|
115
138
|
[#16]: https://github.com/halostatue/minitar/issues/16
|
116
139
|
[#23]: https://github.com/halostatue/minitar/issues/23
|
117
140
|
[#24]: https://github.com/halostatue/minitar/issues/24
|
141
|
+
[#26]: https://github.com/halostatue/minitar/issues/26
|
142
|
+
[#28]: https://github.com/halostatue/minitar/issues/28
|
143
|
+
[#29]: https://github.com/halostatue/minitar/issues/29
|
144
|
+
[#30]: https://github.com/halostatue/minitar/issues/30
|
145
|
+
[#33]: https://github.com/halostatue/minitar/issues/33
|
data/README.rdoc
CHANGED
@@ -14,9 +14,12 @@ coveralls :: {<img src="https://coveralls.io/repos/halostatue/minitar/badge.svg"
|
|
14
14
|
The minitar library is a pure-Ruby library that provides the ability to deal
|
15
15
|
with POSIX tar(1) archive files.
|
16
16
|
|
17
|
-
This is release 0.
|
18
|
-
|
19
|
-
|
17
|
+
This is release 0.7, providing fixes for several issues and clarifying the
|
18
|
+
Minitar security stance. There are two minor breaking changes in this version
|
19
|
+
so that exceptions will be thrown if a negative size is provided in a tar
|
20
|
+
stream header or if the tar stream header is otherwise invalid.
|
21
|
+
|
22
|
+
This release continues the migration and modernization of the code:
|
20
23
|
|
21
24
|
* the licence has been changed to match the modern Ruby licensing scheme
|
22
25
|
(Ruby and Simplified BSD instead of Ruby and GNU GPL);
|
@@ -73,6 +76,34 @@ wrapped data stream object.
|
|
73
76
|
tar.close
|
74
77
|
end
|
75
78
|
|
79
|
+
== Minitar and Security
|
80
|
+
|
81
|
+
Minitar aims to be secure by default for the data *inside* of a tarfile. If
|
82
|
+
there are any security issues discovered, please feel free to open an issue.
|
83
|
+
Should you wish to make a more confidential report, you can find my PGP key
|
84
|
+
information at {Keybase}[https://keybase.io/halostatue]. Bear with me: I do not
|
85
|
+
use PGP regularly, so it may take some time to remember the command invocations
|
86
|
+
required to successfully handle this.
|
87
|
+
|
88
|
+
Minitar does *not* perform validation of path names provided to the convenience
|
89
|
+
calsses Minitar::Output and Minitar::Input, which use Kernel.open for their
|
90
|
+
underlying implementations when not given an IO-like object.
|
91
|
+
|
92
|
+
Improper use of these classes with arbitrary input filenames may leave your
|
93
|
+
your software to the same class of vulnerability as reported for Net::FTP
|
94
|
+
({CVE-2017-17405}[https://nvd.nist.gov/vuln/detail/CVE-2017-17405]). Of
|
95
|
+
particular note, "if the localfile argument starts with the '|' pipe character,
|
96
|
+
the command following the pipe character is executed."
|
97
|
+
|
98
|
+
Additionally, the use of the `open-uri` library (which extends Kernel.open with
|
99
|
+
transparent implementations of Net::HTTP, Net::HTTPS, and Net::FTP), there are
|
100
|
+
other possible vulnerabilities when accepting arbitrary input, as
|
101
|
+
{detailed}[https://sakurity.com/blog/2015/02/28/openuri.html] by Egor Homakov.
|
102
|
+
|
103
|
+
These security vulnerabilities may be avoided, even with the Minitar::Output
|
104
|
+
and Minitar::Input convenience classes, by providing IO-like objects instead of
|
105
|
+
pathname-like objects as the source or destination of these classes.
|
106
|
+
|
76
107
|
== minitar Semantic Versioning
|
77
108
|
|
78
109
|
The minitar library uses a {Semantic Versioning}[http://semver.org/] scheme
|
data/lib/archive/tar/minitar.rb
CHANGED
@@ -73,7 +73,7 @@ end
|
|
73
73
|
# tar.close
|
74
74
|
# end
|
75
75
|
module Archive::Tar::Minitar
|
76
|
-
VERSION = '0.
|
76
|
+
VERSION = '0.7'.freeze # :nodoc:
|
77
77
|
|
78
78
|
# The base class for any minitar error.
|
79
79
|
Error = Class.new(::StandardError)
|
@@ -91,6 +91,8 @@ module Archive::Tar::Minitar
|
|
91
91
|
# The exception raised when a file contains a relative path in secure mode
|
92
92
|
# (the default for this version).
|
93
93
|
SecureRelativePathError = Class.new(Error)
|
94
|
+
# The exception raised when a file contains an invalid Posix header.
|
95
|
+
InvalidTarStream = Class.new(Error)
|
94
96
|
|
95
97
|
class << self
|
96
98
|
# Tests if +path+ refers to a directory. Fixes an apparently
|
@@ -36,6 +36,9 @@ module Archive::Tar::Minitar; end
|
|
36
36
|
# unrecognized typeflag value as a regular file."
|
37
37
|
class Archive::Tar::Minitar::PosixHeader
|
38
38
|
BLOCK_SIZE = 512
|
39
|
+
MAGIC_BYTES = 'ustar'.freeze
|
40
|
+
|
41
|
+
GNU_EXT_LONG_LINK = '././@LongLink'
|
39
42
|
|
40
43
|
# Fields that must be set in a POSIX tar(1) header.
|
41
44
|
REQUIRED_FIELDS = [ :name, :size, :prefix, :mode ].freeze
|
@@ -81,7 +84,7 @@ class Archive::Tar::Minitar::PosixHeader
|
|
81
84
|
mode = fields.shift.oct
|
82
85
|
uid = fields.shift.oct
|
83
86
|
gid = fields.shift.oct
|
84
|
-
size = fields.shift
|
87
|
+
size = strict_oct(fields.shift)
|
85
88
|
mtime = fields.shift.oct
|
86
89
|
checksum = fields.shift.oct
|
87
90
|
typeflag = fields.shift
|
@@ -116,6 +119,13 @@ class Archive::Tar::Minitar::PosixHeader
|
|
116
119
|
:linkname => linkname
|
117
120
|
)
|
118
121
|
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def strict_oct(string)
|
126
|
+
return string.oct if string =~ /\A[0-7]*\z/
|
127
|
+
raise ArgumentError, "#{string.inspect} is not a valid octal string"
|
128
|
+
end
|
119
129
|
end
|
120
130
|
|
121
131
|
# Creates a new PosixHeader. A PosixHeader cannot be created unless
|
@@ -128,7 +138,7 @@ class Archive::Tar::Minitar::PosixHeader
|
|
128
138
|
v[:mtime] = v[:mtime].to_i
|
129
139
|
v[:checksum] ||= ''
|
130
140
|
v[:typeflag] ||= '0'
|
131
|
-
v[:magic] ||=
|
141
|
+
v[:magic] ||= MAGIC_BYTES
|
132
142
|
v[:version] ||= '00'
|
133
143
|
|
134
144
|
FIELDS.each do |f|
|
@@ -143,10 +153,15 @@ class Archive::Tar::Minitar::PosixHeader
|
|
143
153
|
@empty
|
144
154
|
end
|
145
155
|
|
156
|
+
# Indicates if the header has a valid magic value.
|
157
|
+
def valid?
|
158
|
+
empty? || @magic == MAGIC_BYTES
|
159
|
+
end
|
160
|
+
|
146
161
|
# Returns +true+ if the header is a long name special header which indicates
|
147
162
|
# that the next block of data is the filename.
|
148
163
|
def long_name?
|
149
|
-
typeflag == 'L' && name ==
|
164
|
+
typeflag == 'L' && name == GNU_EXT_LONG_LINK
|
150
165
|
end
|
151
166
|
|
152
167
|
# A string representation of the header.
|
@@ -5,6 +5,7 @@ module Archive::Tar::Minitar
|
|
5
5
|
# stream may be sequential or random access, but certain features only work
|
6
6
|
# with random access data streams.
|
7
7
|
class Reader
|
8
|
+
include Enumerable
|
8
9
|
# This marks the EntryStream closed for reading without closing the
|
9
10
|
# actual data stream.
|
10
11
|
module InvalidEntryStream
|
@@ -179,7 +180,7 @@ module Archive::Tar::Minitar
|
|
179
180
|
# Creates and returns a new Reader object.
|
180
181
|
def initialize(io)
|
181
182
|
@io = io
|
182
|
-
@init_pos = io.pos
|
183
|
+
@init_pos = io.pos rescue nil
|
183
184
|
end
|
184
185
|
|
185
186
|
# Resets the read pointer to the beginning of data stream. Do not call
|
@@ -207,8 +208,11 @@ module Archive::Tar::Minitar
|
|
207
208
|
return if @io.eof?
|
208
209
|
|
209
210
|
header = Archive::Tar::Minitar::PosixHeader.from_stream(@io)
|
211
|
+
raise Archive::Tar::Minitar::InvalidTarStream unless header.valid?
|
210
212
|
return if header.empty?
|
211
213
|
|
214
|
+
raise Archive::Tar::Minitar::InvalidTarStream if header.size < 0
|
215
|
+
|
212
216
|
if header.long_name?
|
213
217
|
name = @io.read(512).rstrip
|
214
218
|
header = PosixHeader.from_stream(@io)
|
@@ -132,11 +132,8 @@ module Archive::Tar::Minitar
|
|
132
132
|
# end
|
133
133
|
def add_file_simple(name, opts = {}) # :yields BoundedWriteStream:
|
134
134
|
raise ClosedStream if @closed
|
135
|
-
name, prefix = split_name(name)
|
136
135
|
|
137
136
|
header = {
|
138
|
-
:prefix => prefix,
|
139
|
-
:name => name,
|
140
137
|
:mode => opts.fetch(:mode, 0o644),
|
141
138
|
:mtime => opts.fetch(:mtime, nil),
|
142
139
|
:gid => opts.fetch(:gid, nil),
|
@@ -161,7 +158,7 @@ module Archive::Tar::Minitar
|
|
161
158
|
|
162
159
|
header[:size] = size
|
163
160
|
|
164
|
-
|
161
|
+
write_header(name, header)
|
165
162
|
|
166
163
|
os = BoundedWriteStream.new(@io, opts[:size])
|
167
164
|
if block_given?
|
@@ -208,8 +205,6 @@ module Archive::Tar::Minitar
|
|
208
205
|
raise Archive::Tar::Minitar::NonSeekableStream
|
209
206
|
end
|
210
207
|
|
211
|
-
name, prefix = split_name(name)
|
212
|
-
|
213
208
|
init_pos = @io.pos
|
214
209
|
@io.write("\0" * 512) # placeholder for the header
|
215
210
|
|
@@ -222,15 +217,13 @@ module Archive::Tar::Minitar
|
|
222
217
|
final_pos, @io.pos = @io.pos, init_pos
|
223
218
|
|
224
219
|
header = {
|
225
|
-
:name => name,
|
226
220
|
:mode => opts[:mode],
|
227
221
|
:mtime => opts[:mtime],
|
228
222
|
:size => size,
|
229
223
|
:gid => opts[:gid],
|
230
224
|
:uid => opts[:uid],
|
231
|
-
:prefix => prefix
|
232
225
|
}
|
233
|
-
|
226
|
+
write_header(name, header)
|
234
227
|
@io.pos = final_pos
|
235
228
|
end
|
236
229
|
|
@@ -238,18 +231,15 @@ module Archive::Tar::Minitar
|
|
238
231
|
def mkdir(name, opts = {})
|
239
232
|
raise ClosedStream if @closed
|
240
233
|
|
241
|
-
name, prefix = split_name(name)
|
242
234
|
header = {
|
243
|
-
:name => name,
|
244
235
|
:mode => opts[:mode],
|
245
236
|
:typeflag => '5',
|
246
237
|
:size => 0,
|
247
238
|
:gid => opts[:gid],
|
248
239
|
:uid => opts[:uid],
|
249
240
|
:mtime => opts[:mtime],
|
250
|
-
:prefix => prefix
|
251
241
|
}
|
252
|
-
|
242
|
+
write_header(name, header)
|
253
243
|
nil
|
254
244
|
end
|
255
245
|
|
@@ -275,11 +265,27 @@ module Archive::Tar::Minitar
|
|
275
265
|
|
276
266
|
private
|
277
267
|
|
278
|
-
def
|
279
|
-
|
268
|
+
def write_header(long_name, header)
|
269
|
+
short_name, prefix, needs_long_name = split_name(long_name)
|
270
|
+
|
271
|
+
if needs_long_name
|
272
|
+
long_name_header = {
|
273
|
+
:prefix => '',
|
274
|
+
:name => PosixHeader::GNU_EXT_LONG_LINK,
|
275
|
+
:typeflag => 'L',
|
276
|
+
:size => long_name.length,
|
277
|
+
:mode => 0,
|
278
|
+
}
|
279
|
+
@io.write(PosixHeader.new(long_name_header))
|
280
|
+
@io.write(long_name)
|
281
|
+
@io.write("\0" * (512 - (long_name.length % 512)))
|
282
|
+
end
|
280
283
|
|
281
|
-
|
284
|
+
new_header = header.merge({ :name => short_name, :prefix => prefix })
|
285
|
+
@io.write(PosixHeader.new(new_header))
|
286
|
+
end
|
282
287
|
|
288
|
+
def split_name(name)
|
283
289
|
if name.size <= 100
|
284
290
|
prefix = ''
|
285
291
|
else
|
@@ -297,11 +303,9 @@ module Archive::Tar::Minitar
|
|
297
303
|
prefix = (parts + [nxt]).join('/')
|
298
304
|
|
299
305
|
name = newname
|
300
|
-
|
301
|
-
raise FileNameTooLong if name.size > 100 || prefix.size > 155
|
302
306
|
end
|
303
307
|
|
304
|
-
[ name, prefix ]
|
308
|
+
[ name, prefix, (name.size > 100 || prefix.size > 155) ]
|
305
309
|
end
|
306
310
|
end
|
307
311
|
end
|
data/test/test_tar_header.rb
CHANGED
@@ -71,4 +71,19 @@ class TestTarHeader < Minitest::Test
|
|
71
71
|
h = Archive::Tar::Minitar::PosixHeader.from_stream header
|
72
72
|
assert_equal('a ', h.name)
|
73
73
|
end
|
74
|
+
|
75
|
+
def test_valid_with_valid_header
|
76
|
+
header = tar_file_header('a' * 100, '', 0o12345, 10)
|
77
|
+
header = StringIO.new(header)
|
78
|
+
h = Archive::Tar::Minitar::PosixHeader.from_stream header
|
79
|
+
|
80
|
+
assert(h.valid?)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_valid_with_invalid_header
|
84
|
+
header = StringIO.new("testing")
|
85
|
+
h = Archive::Tar::Minitar::PosixHeader.from_stream header
|
86
|
+
|
87
|
+
refute(h.valid?)
|
88
|
+
end
|
74
89
|
end
|
data/test/test_tar_output.rb
CHANGED
@@ -4,9 +4,11 @@ require 'minitar'
|
|
4
4
|
require 'minitest_helper'
|
5
5
|
|
6
6
|
class TestTarOutput < Minitest::Test
|
7
|
+
NAMES = ['a', 'b', 'c', 'd' * 200]
|
8
|
+
|
7
9
|
def setup
|
8
10
|
FileUtils.mkdir_p('data__')
|
9
|
-
|
11
|
+
NAMES.each do |filename|
|
10
12
|
name = File.join('data__', filename)
|
11
13
|
File.open(name, 'wb') { |f|
|
12
14
|
f.puts "#{name}: 123456789012345678901234567890"
|
@@ -30,7 +32,7 @@ class TestTarOutput < Minitest::Test
|
|
30
32
|
def test_file_looks_good
|
31
33
|
Minitar::Output.open(@tarfile) do |os|
|
32
34
|
Dir.chdir('data__') do
|
33
|
-
|
35
|
+
NAMES.each do |name|
|
34
36
|
stat = File.stat(name)
|
35
37
|
opts = { :size => stat.size, :mode => 0o644 }
|
36
38
|
os.tar.add_file_simple(name, opts) do |ss|
|
@@ -41,19 +43,10 @@ class TestTarOutput < Minitest::Test
|
|
41
43
|
end
|
42
44
|
ff = File.open(@tarfile, 'rb')
|
43
45
|
Minitar::Reader.open(ff) do |is|
|
44
|
-
|
45
|
-
|
46
|
-
case ii
|
47
|
-
when 0
|
48
|
-
assert_equal('a', entry.name)
|
49
|
-
when 1
|
50
|
-
assert_equal('b', entry.name)
|
51
|
-
when 2
|
52
|
-
assert_equal('c', entry.name)
|
53
|
-
end
|
54
|
-
ii += 1
|
46
|
+
names_from_tar = is.map do |entry|
|
47
|
+
entry.name
|
55
48
|
end
|
56
|
-
assert_equal(
|
49
|
+
assert_equal(NAMES, names_from_tar)
|
57
50
|
end
|
58
51
|
ensure
|
59
52
|
ff.close if ff
|
data/test/test_tar_reader.rb
CHANGED
@@ -158,4 +158,14 @@ class TestTarReader < Minitest::Test
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
def test_read_invalid_tar_file
|
163
|
+
assert_raises Archive::Tar::Minitar::InvalidTarStream do
|
164
|
+
Minitar::Reader.open(StringIO.new("testing")) do |r|
|
165
|
+
r.each_entry do |entry|
|
166
|
+
fail "invalid tar file should not read files"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
161
171
|
end
|
data/test/test_tar_writer.rb
CHANGED
@@ -106,21 +106,24 @@ class TestTarWriter < Minitest::Test
|
|
106
106
|
@dummyos.data[2 * i * 512, 512]
|
107
107
|
)
|
108
108
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_file_name_is_long
|
112
|
+
@dummyos.reset
|
113
|
+
|
114
|
+
@os.add_file_simple(File.join('a' * 152, 'b' * 10, 'c' * 92),
|
115
|
+
:mode => 0o644, :size => 10) {}
|
116
|
+
@os.add_file_simple(File.join('d' * 162, 'e' * 10),
|
117
|
+
:mode => 0o644, :size => 10) {}
|
118
|
+
@os.add_file_simple(File.join('f' * 10, 'g' * 110),
|
119
|
+
:mode => 0o644, :size => 10) {}
|
121
120
|
# Issue #6.
|
122
|
-
|
123
|
-
|
121
|
+
@os.add_file_simple('a' * 114, :mode => 0o644, :size => 10) {}
|
122
|
+
|
123
|
+
# "././@LongLink", a file name, its actual header, its data, ...
|
124
|
+
4.times do |i|
|
125
|
+
assert_equal(Minitar::PosixHeader::GNU_EXT_LONG_LINK,
|
126
|
+
@dummyos.data[4 * i * 512, 32].rstrip)
|
124
127
|
end
|
125
128
|
end
|
126
129
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Austin Ziegler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '5.
|
19
|
+
version: '5.11'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '5.
|
26
|
+
version: '5.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hoe-doofus
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,21 +154,24 @@ dependencies:
|
|
154
154
|
requirements:
|
155
155
|
- - "~>"
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: '3.
|
157
|
+
version: '3.17'
|
158
158
|
type: :development
|
159
159
|
prerelease: false
|
160
160
|
version_requirements: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
162
|
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
|
-
version: '3.
|
164
|
+
version: '3.17'
|
165
165
|
description: |-
|
166
166
|
The minitar library is a pure-Ruby library that provides the ability to deal
|
167
167
|
with POSIX tar(1) archive files.
|
168
168
|
|
169
|
-
This is release 0.
|
170
|
-
|
171
|
-
|
169
|
+
This is release 0.7, providing fixes for several issues and clarifying the
|
170
|
+
Minitar security stance. There are two minor breaking changes in this version
|
171
|
+
so that exceptions will be thrown if a negative size is provided in a tar
|
172
|
+
stream header or if the tar stream header is otherwise invalid.
|
173
|
+
|
174
|
+
This release continues the migration and modernization of the code:
|
172
175
|
|
173
176
|
* the licence has been changed to match the modern Ruby licensing scheme
|
174
177
|
(Ruby and Simplified BSD instead of Ruby and GNU GPL);
|
@@ -248,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
248
251
|
version: '0'
|
249
252
|
requirements: []
|
250
253
|
rubyforge_project:
|
251
|
-
rubygems_version: 2.
|
254
|
+
rubygems_version: 2.7.7
|
252
255
|
signing_key:
|
253
256
|
specification_version: 4
|
254
257
|
summary: The minitar library is a pure-Ruby library that provides the ability to deal
|