rubygems-update 3.4.18 → 3.4.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +48 -0
  3. data/POLICIES.md +2 -2
  4. data/bundler/CHANGELOG.md +45 -0
  5. data/bundler/lib/bundler/build_metadata.rb +2 -2
  6. data/bundler/lib/bundler/cli/binstubs.rb +1 -1
  7. data/bundler/lib/bundler/cli/info.rb +1 -1
  8. data/bundler/lib/bundler/cli/install.rb +1 -1
  9. data/bundler/lib/bundler/cli/outdated.rb +1 -1
  10. data/bundler/lib/bundler/cli/platform.rb +7 -5
  11. data/bundler/lib/bundler/cli/update.rb +1 -0
  12. data/bundler/lib/bundler/definition.rb +25 -20
  13. data/bundler/lib/bundler/dsl.rb +1 -1
  14. data/bundler/lib/bundler/env.rb +1 -1
  15. data/bundler/lib/bundler/fetcher/base.rb +2 -2
  16. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -8
  17. data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
  18. data/bundler/lib/bundler/fetcher/downloader.rb +2 -0
  19. data/bundler/lib/bundler/fetcher/index.rb +1 -2
  20. data/bundler/lib/bundler/fetcher.rb +42 -31
  21. data/bundler/lib/bundler/friendly_errors.rb +1 -1
  22. data/bundler/lib/bundler/gem_helper.rb +3 -4
  23. data/bundler/lib/bundler/index.rb +62 -31
  24. data/bundler/lib/bundler/installer/parallel_installer.rb +1 -1
  25. data/bundler/lib/bundler/installer/standalone.rb +8 -1
  26. data/bundler/lib/bundler/lockfile_parser.rb +3 -15
  27. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  28. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  29. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  30. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  31. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  32. data/bundler/lib/bundler/man/bundle-config.1 +1 -1
  33. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  34. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  35. data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-info.1 +3 -3
  39. data/bundler/lib/bundler/man/bundle-info.1.ronn +3 -3
  40. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  41. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-install.1 +1 -1
  43. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  44. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  47. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  48. data/bundler/lib/bundler/man/bundle-plugin.1 +1 -1
  49. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  50. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  51. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  52. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  53. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  54. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  55. data/bundler/lib/bundler/man/bundle.1 +1 -1
  56. data/bundler/lib/bundler/man/gemfile.5 +25 -1
  57. data/bundler/lib/bundler/man/gemfile.5.ronn +10 -0
  58. data/bundler/lib/bundler/plugin/index.rb +1 -1
  59. data/bundler/lib/bundler/plugin.rb +1 -1
  60. data/bundler/lib/bundler/resolver.rb +18 -3
  61. data/bundler/lib/bundler/retry.rb +1 -1
  62. data/bundler/lib/bundler/ruby_dsl.rb +27 -0
  63. data/bundler/lib/bundler/ruby_version.rb +2 -2
  64. data/bundler/lib/bundler/rubygems_integration.rb +1 -1
  65. data/bundler/lib/bundler/self_manager.rb +2 -0
  66. data/bundler/lib/bundler/settings.rb +37 -13
  67. data/bundler/lib/bundler/source/git/git_proxy.rb +14 -2
  68. data/bundler/lib/bundler/source/git.rb +7 -0
  69. data/bundler/lib/bundler/source/rubygems.rb +22 -25
  70. data/bundler/lib/bundler/source_list.rb +0 -4
  71. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +1 -1
  72. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  73. data/bundler/lib/bundler/version.rb +1 -1
  74. data/bundler/lib/bundler.rb +1 -1
  75. data/lib/rubygems/available_set.rb +1 -1
  76. data/lib/rubygems/basic_specification.rb +2 -2
  77. data/lib/rubygems/bundler_version_finder.rb +1 -1
  78. data/lib/rubygems/command.rb +16 -19
  79. data/lib/rubygems/commands/cert_command.rb +1 -1
  80. data/lib/rubygems/commands/dependency_command.rb +3 -4
  81. data/lib/rubygems/commands/owner_command.rb +8 -10
  82. data/lib/rubygems/commands/uninstall_command.rb +6 -7
  83. data/lib/rubygems/commands/unpack_command.rb +4 -6
  84. data/lib/rubygems/config_file.rb +1 -1
  85. data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
  86. data/lib/rubygems/core_ext/kernel_warn.rb +4 -5
  87. data/lib/rubygems/dependency_installer.rb +8 -12
  88. data/lib/rubygems/deprecate.rb +2 -2
  89. data/lib/rubygems/gemcutter_utilities.rb +3 -4
  90. data/lib/rubygems/installer.rb +9 -11
  91. data/lib/rubygems/name_tuple.rb +1 -1
  92. data/lib/rubygems/package/tar_reader/entry.rb +18 -20
  93. data/lib/rubygems/package/tar_reader.rb +0 -5
  94. data/lib/rubygems/package.rb +11 -6
  95. data/lib/rubygems/query_utils.rb +1 -1
  96. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
  97. data/lib/rubygems/request_set/lockfile/parser.rb +1 -1
  98. data/lib/rubygems/resolver/activation_request.rb +2 -4
  99. data/lib/rubygems/resolver/installed_specification.rb +1 -1
  100. data/lib/rubygems/resolver/local_specification.rb +1 -1
  101. data/lib/rubygems/s3_uri_signer.rb +1 -1
  102. data/lib/rubygems/security/trust_dir.rb +4 -6
  103. data/lib/rubygems/security.rb +1 -1
  104. data/lib/rubygems/source/local.rb +34 -37
  105. data/lib/rubygems/source.rb +2 -2
  106. data/lib/rubygems/source_list.rb +2 -2
  107. data/lib/rubygems/spec_fetcher.rb +29 -33
  108. data/lib/rubygems/specification.rb +36 -28
  109. data/lib/rubygems/specification_policy.rb +33 -32
  110. data/lib/rubygems/stub_specification.rb +13 -10
  111. data/lib/rubygems/uninstaller.rb +1 -1
  112. data/lib/rubygems/user_interaction.rb +4 -4
  113. data/lib/rubygems/util/licenses.rb +115 -0
  114. data/lib/rubygems/validator.rb +5 -7
  115. data/lib/rubygems.rb +6 -9
  116. data/rubygems-update.gemspec +4 -4
  117. data/test/rubygems/helper.rb +18 -20
  118. data/test/rubygems/test_gem.rb +4 -4
  119. data/test/rubygems/test_gem_commands_build_command.rb +2 -1
  120. data/test/rubygems/test_gem_commands_stale_command.rb +1 -1
  121. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +28 -12
  122. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +1 -1
  123. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +16 -14
  124. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  125. data/test/rubygems/test_gem_indexer.rb +1 -1
  126. data/test/rubygems/test_gem_package.rb +117 -2
  127. data/test/rubygems/test_gem_package_tar_header.rb +7 -7
  128. data/test/rubygems/test_gem_package_tar_reader_entry.rb +53 -1
  129. data/test/rubygems/test_gem_package_tar_writer.rb +13 -13
  130. data/test/rubygems/test_gem_remote_fetcher.rb +21 -25
  131. data/test/rubygems/test_gem_requirement.rb +1 -1
  132. data/test/rubygems/test_gem_specification.rb +42 -6
  133. data/test/rubygems/test_gem_update_suggestion.rb +14 -20
  134. data/test/rubygems/test_require.rb +4 -6
  135. data/test/rubygems/utilities.rb +2 -2
  136. metadata +31 -5
@@ -13,9 +13,9 @@ dependencies = [
13
13
 
14
14
  [[package]]
15
15
  name = "bindgen"
16
- version = "0.60.1"
16
+ version = "0.66.1"
17
17
  source = "registry+https://github.com/rust-lang/crates.io-index"
18
- checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6"
18
+ checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
19
19
  dependencies = [
20
20
  "bitflags",
21
21
  "cexpr",
@@ -28,13 +28,14 @@ dependencies = [
28
28
  "regex",
29
29
  "rustc-hash",
30
30
  "shlex",
31
+ "syn",
31
32
  ]
32
33
 
33
34
  [[package]]
34
35
  name = "bitflags"
35
- version = "1.3.2"
36
+ version = "2.3.3"
36
37
  source = "registry+https://github.com/rust-lang/crates.io-index"
37
- checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
38
+ checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
38
39
 
39
40
  [[package]]
40
41
  name = "cexpr"
@@ -133,40 +134,44 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
133
134
 
134
135
  [[package]]
135
136
  name = "proc-macro2"
136
- version = "1.0.47"
137
+ version = "1.0.66"
137
138
  source = "registry+https://github.com/rust-lang/crates.io-index"
138
- checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
139
+ checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
139
140
  dependencies = [
140
141
  "unicode-ident",
141
142
  ]
142
143
 
143
144
  [[package]]
144
145
  name = "quote"
145
- version = "1.0.21"
146
+ version = "1.0.32"
146
147
  source = "registry+https://github.com/rust-lang/crates.io-index"
147
- checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
148
+ checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
148
149
  dependencies = [
149
150
  "proc-macro2",
150
151
  ]
151
152
 
152
153
  [[package]]
153
154
  name = "rb-sys"
154
- version = "0.9.54"
155
+ version = "0.9.81"
155
156
  source = "registry+https://github.com/rust-lang/crates.io-index"
156
- checksum = "b3277448b8eee18de8bedb18883ae02dcd60d47922ddfc6ab408def77da0a9b4"
157
+ checksum = "a57240b308b155b09dce81e32829966a99f52d1088b45957e4283e526c5317a1"
157
158
  dependencies = [
158
159
  "rb-sys-build",
159
160
  ]
160
161
 
161
162
  [[package]]
162
163
  name = "rb-sys-build"
163
- version = "0.9.54"
164
+ version = "0.9.81"
164
165
  source = "registry+https://github.com/rust-lang/crates.io-index"
165
- checksum = "c9baae802c93180af02cccb21819589d109070f8e28e14e7070a9ffdeca9b464"
166
+ checksum = "f24ce877a4c5d07f06f6aa6fec3ac95e4b357b9f73b0f5445d8cbb7266d410e8"
166
167
  dependencies = [
167
168
  "bindgen",
169
+ "lazy_static",
170
+ "proc-macro2",
171
+ "quote",
168
172
  "regex",
169
173
  "shell-words",
174
+ "syn",
170
175
  ]
171
176
 
172
177
  [[package]]
@@ -204,6 +209,17 @@ version = "1.1.0"
204
209
  source = "registry+https://github.com/rust-lang/crates.io-index"
205
210
  checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
206
211
 
212
+ [[package]]
213
+ name = "syn"
214
+ version = "2.0.28"
215
+ source = "registry+https://github.com/rust-lang/crates.io-index"
216
+ checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
217
+ dependencies = [
218
+ "proc-macro2",
219
+ "quote",
220
+ "unicode-ident",
221
+ ]
222
+
207
223
  [[package]]
208
224
  name = "unicode-ident"
209
225
  version = "1.0.5"
@@ -7,4 +7,4 @@ edition = "2021"
7
7
  crate-type = ["cdylib"]
8
8
 
9
9
  [dependencies]
10
- rb-sys = "0.9.54"
10
+ rb-sys = "0.9.81"
@@ -13,9 +13,9 @@ dependencies = [
13
13
 
14
14
  [[package]]
15
15
  name = "bindgen"
16
- version = "0.60.1"
16
+ version = "0.66.1"
17
17
  source = "registry+https://github.com/rust-lang/crates.io-index"
18
- checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6"
18
+ checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
19
19
  dependencies = [
20
20
  "bitflags",
21
21
  "cexpr",
@@ -28,13 +28,14 @@ dependencies = [
28
28
  "regex",
29
29
  "rustc-hash",
30
30
  "shlex",
31
+ "syn",
31
32
  ]
32
33
 
33
34
  [[package]]
34
35
  name = "bitflags"
35
- version = "1.3.2"
36
+ version = "2.3.3"
36
37
  source = "registry+https://github.com/rust-lang/crates.io-index"
37
- checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
38
+ checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
38
39
 
39
40
  [[package]]
40
41
  name = "cexpr"
@@ -126,39 +127,40 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
126
127
 
127
128
  [[package]]
128
129
  name = "proc-macro2"
129
- version = "1.0.47"
130
+ version = "1.0.66"
130
131
  source = "registry+https://github.com/rust-lang/crates.io-index"
131
- checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
132
+ checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
132
133
  dependencies = [
133
134
  "unicode-ident",
134
135
  ]
135
136
 
136
137
  [[package]]
137
138
  name = "quote"
138
- version = "1.0.23"
139
+ version = "1.0.32"
139
140
  source = "registry+https://github.com/rust-lang/crates.io-index"
140
- checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
141
+ checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
141
142
  dependencies = [
142
143
  "proc-macro2",
143
144
  ]
144
145
 
145
146
  [[package]]
146
147
  name = "rb-sys"
147
- version = "0.9.65"
148
+ version = "0.9.81"
148
149
  source = "registry+https://github.com/rust-lang/crates.io-index"
149
- checksum = "e8fe617bad8e88fd7e5d6f432e35f09e5f94144dfb8e8ee4adde82fb920dc59b"
150
+ checksum = "a57240b308b155b09dce81e32829966a99f52d1088b45957e4283e526c5317a1"
150
151
  dependencies = [
151
152
  "rb-sys-build",
152
153
  ]
153
154
 
154
155
  [[package]]
155
156
  name = "rb-sys-build"
156
- version = "0.9.65"
157
+ version = "0.9.81"
157
158
  source = "registry+https://github.com/rust-lang/crates.io-index"
158
- checksum = "007e63597f91c711cbb299e60fecbdb6f5ad4a066d6a20c81943893f1584c895"
159
+ checksum = "f24ce877a4c5d07f06f6aa6fec3ac95e4b357b9f73b0f5445d8cbb7266d410e8"
159
160
  dependencies = [
160
161
  "bindgen",
161
162
  "lazy_static",
163
+ "proc-macro2",
162
164
  "quote",
163
165
  "regex",
164
166
  "shell-words",
@@ -209,9 +211,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
209
211
 
210
212
  [[package]]
211
213
  name = "syn"
212
- version = "1.0.107"
214
+ version = "2.0.28"
213
215
  source = "registry+https://github.com/rust-lang/crates.io-index"
214
- checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
216
+ checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
215
217
  dependencies = [
216
218
  "proc-macro2",
217
219
  "quote",
@@ -7,4 +7,4 @@ edition = "2021"
7
7
  crate-type = ["cdylib"]
8
8
 
9
9
  [dependencies]
10
- rb-sys = "0.9.65"
10
+ rb-sys = "0.9.81"
@@ -10,7 +10,7 @@ class TestGemIndexer < Gem::TestCase
10
10
  util_make_gems
11
11
 
12
12
  @d2_0 = util_spec "d", "2.0" do |s|
13
- s.date = Gem::Specification::TODAY - 86400 * 3
13
+ s.date = Gem::Specification::TODAY - 86_400 * 3
14
14
  end
15
15
  util_build_gem @d2_0
16
16
 
@@ -573,6 +573,32 @@ class TestGemPackage < Gem::Package::TarTestCase
573
573
  File.read(extracted)
574
574
  end
575
575
 
576
+ def test_extract_symlink_into_symlink_dir
577
+ package = Gem::Package.new @gem
578
+ tgz_io = util_tar_gz do |tar|
579
+ tar.mkdir "lib", 0o755
580
+ tar.add_symlink "lib/link", "./inside.rb", 0o644
581
+ tar.add_file "lib/inside.rb", 0o644 do |io|
582
+ io.write "hi"
583
+ end
584
+ end
585
+
586
+ destination_subdir = File.join @destination, "subdir"
587
+ FileUtils.mkdir_p destination_subdir
588
+
589
+ destination_linkdir = File.join @destination, "linkdir"
590
+ File.symlink(destination_subdir, destination_linkdir)
591
+
592
+ package.extract_tar_gz tgz_io, destination_linkdir
593
+
594
+ extracted = File.join destination_subdir, "lib/link"
595
+ assert_path_exist extracted
596
+ assert_equal "./inside.rb",
597
+ File.readlink(extracted)
598
+ assert_equal "hi",
599
+ File.read(extracted)
600
+ end
601
+
576
602
  def test_extract_tar_gz_symlink_broken_relative_path
577
603
  package = Gem::Package.new @gem
578
604
  package.verify
@@ -642,8 +668,8 @@ class TestGemPackage < Gem::Package::TarTestCase
642
668
  pend "TMPDIR seems too long to add it as symlink into tar" if destination_user_dir.size > 90
643
669
 
644
670
  tgz_io = util_tar_gz do |tar|
645
- tar.add_symlink "link", destination_user_dir, 16877
646
- tar.add_symlink "link/dir", ".", 16877
671
+ tar.add_symlink "link", destination_user_dir, 16_877
672
+ tar.add_symlink "link/dir", ".", 16_877
647
673
  end
648
674
 
649
675
  expected_exceptions = win_platform? ? [Gem::Package::SymlinkError, Errno::EACCES] : [Gem::Package::SymlinkError]
@@ -943,6 +969,95 @@ class TestGemPackage < Gem::Package::TarTestCase
943
969
  tf.close!
944
970
  end
945
971
 
972
+ def test_verify_corrupt_tar_metadata_entry
973
+ gem = tar_file_header("metadata.gz", "", 0, 999, Time.now)
974
+
975
+ File.open "corrupt.gem", "wb" do |io|
976
+ io.write gem
977
+ end
978
+
979
+ package = Gem::Package.new "corrupt.gem"
980
+
981
+ e = nil
982
+ out_err = capture_output do
983
+ e = assert_raise Gem::Package::FormatError do
984
+ package.verify
985
+ end
986
+ end
987
+
988
+ assert_match(/(EOFError|end of file reached) in corrupt.gem/i, e.message)
989
+ assert_equal(["", "Exception while verifying corrupt.gem\n"], out_err)
990
+ end
991
+
992
+ def test_verify_corrupt_tar_checksums_entry
993
+ gem = tar_file_header("checksums.yaml.gz", "", 0, 100, Time.now)
994
+
995
+ File.open "corrupt.gem", "wb" do |io|
996
+ io.write gem
997
+ end
998
+
999
+ package = Gem::Package.new "corrupt.gem"
1000
+
1001
+ e = assert_raise Gem::Package::FormatError do
1002
+ package.verify
1003
+ end
1004
+
1005
+ assert_equal "not in gzip format in corrupt.gem", e.message
1006
+ end
1007
+
1008
+ def test_verify_corrupt_tar_data_entry
1009
+ gem = tar_file_header("data.tar.gz", "", 0, 100, Time.now)
1010
+
1011
+ File.open "corrupt.gem", "wb" do |io|
1012
+ io.write gem
1013
+ end
1014
+
1015
+ package = Gem::Package.new "corrupt.gem"
1016
+
1017
+ e = nil
1018
+ out_err = capture_output do
1019
+ e = assert_raise Gem::Package::FormatError do
1020
+ package.verify
1021
+ end
1022
+ end
1023
+
1024
+ assert_match(/(EOFError|end of file reached) in corrupt.gem/i, e.message)
1025
+ assert_equal(["", "Exception while verifying corrupt.gem\n"], out_err)
1026
+ end
1027
+
1028
+ def test_corrupt_data_tar_gz
1029
+ data_tgz = util_gzip tar_file_header("lib/code.rb", "", 0, 100, Time.now)
1030
+ metadata_gz = util_gzip @spec.to_yaml
1031
+
1032
+ gem = util_tar do |tar|
1033
+ tar.add_file "data.tar.gz", 0o444 do |io|
1034
+ io.write data_tgz
1035
+ end
1036
+
1037
+ tar.add_file "metadata.gz", 0o644 do |io|
1038
+ io.write metadata_gz
1039
+ end
1040
+ end
1041
+
1042
+ File.open "corrupt.gem", "wb" do |io|
1043
+ io.write gem.string
1044
+ end
1045
+
1046
+ package = Gem::Package.new "corrupt.gem"
1047
+
1048
+ e = assert_raise Gem::Package::FormatError do
1049
+ package.contents
1050
+ end
1051
+
1052
+ assert_match(/(EOFError|end of file reached) in corrupt.gem/i, e.message)
1053
+
1054
+ e = assert_raise Gem::Package::FormatError do
1055
+ package.extract_files @destination
1056
+ end
1057
+
1058
+ assert_match(/(EOFError|end of file reached) in corrupt.gem/i, e.message)
1059
+ end
1060
+
946
1061
  def test_verify_empty
947
1062
  FileUtils.touch "empty.gem"
948
1063
 
@@ -11,9 +11,9 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
11
11
  :name => "x",
12
12
  :mode => 0644,
13
13
  :uid => 1000,
14
- :gid => 10000,
14
+ :gid => 10_000,
15
15
  :size => 100,
16
- :mtime => 12345,
16
+ :mtime => 12_345,
17
17
  :typeflag => "0",
18
18
  :linkname => "link",
19
19
  :uname => "user",
@@ -40,12 +40,12 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
40
40
  assert_equal "", @tar_header.checksum, "checksum"
41
41
  assert_equal 1, @tar_header.devmajor, "devmajor"
42
42
  assert_equal 2, @tar_header.devminor, "devminor"
43
- assert_equal 10000, @tar_header.gid, "gid"
43
+ assert_equal 10_000, @tar_header.gid, "gid"
44
44
  assert_equal "group", @tar_header.gname, "gname"
45
45
  assert_equal "link", @tar_header.linkname, "linkname"
46
46
  assert_equal "ustar", @tar_header.magic, "magic"
47
47
  assert_equal 0644, @tar_header.mode, "mode"
48
- assert_equal 12345, @tar_header.mtime, "mtime"
48
+ assert_equal 12_345, @tar_header.mtime, "mtime"
49
49
  assert_equal "x", @tar_header.name, "name"
50
50
  assert_equal "y", @tar_header.prefix, "prefix"
51
51
  assert_equal 100, @tar_header.size, "size"
@@ -195,13 +195,13 @@ tjmather\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
195
195
 
196
196
  tar_header = Gem::Package::TarHeader.from stream
197
197
 
198
- assert_equal 1991400094, tar_header.uid
199
- assert_equal 1991400094, tar_header.gid
198
+ assert_equal 1_991_400_094, tar_header.uid
199
+ assert_equal 1_991_400_094, tar_header.gid
200
200
 
201
201
  assert_equal "GeoIP2-City_20190528/", tar_header.name
202
202
  assert_equal 0755, tar_header.mode
203
203
  assert_equal 0, tar_header.size
204
- assert_equal 1559064640, tar_header.mtime
204
+ assert_equal 1_559_064_640, tar_header.mtime
205
205
  assert_equal 6932, tar_header.checksum
206
206
  end
207
207
 
@@ -177,10 +177,15 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
177
177
  assert_equal @contents[100..-1], @entry.read
178
178
  end
179
179
 
180
- def test_read_partial
180
+ def test_readpartial
181
181
  assert_equal @contents[0...100], @entry.readpartial(100)
182
182
  end
183
183
 
184
+ def test_readpartial_to_eof
185
+ assert_equal @contents, @entry.readpartial(4096)
186
+ assert @entry.eof?
187
+ end
188
+
184
189
  def test_read_partial_buffer
185
190
  buffer = "".b
186
191
  @entry.readpartial(100, buffer)
@@ -189,11 +194,42 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
189
194
 
190
195
  def test_readpartial_past_eof
191
196
  @entry.readpartial(@contents.size)
197
+ assert @entry.eof?
192
198
  assert_raise(EOFError) do
193
199
  @entry.readpartial(1)
194
200
  end
195
201
  end
196
202
 
203
+ def test_read_corrupted_tar
204
+ corrupt_tar = String.new
205
+ corrupt_tar << tar_file_header("lib/foo", "", 0, 100, Time.now)
206
+ corrupt_tar << tar_file_contents("")
207
+ corrupt_entry = util_entry corrupt_tar
208
+
209
+ assert_equal "", corrupt_entry.read(0)
210
+ assert_equal "", corrupt_entry.read, "IO.read without len should return empty string (even though it's at an unpexpected EOF)"
211
+
212
+ corrupt_entry.rewind
213
+
214
+ assert_nil corrupt_entry.read(100), "IO.read with len should return nil as per IO.read docs"
215
+ ensure
216
+ close_util_entry(corrupt_entry) if corrupt_entry
217
+ end
218
+
219
+ def test_readpartial_corrupted_tar
220
+ corrupt_tar = String.new
221
+ corrupt_tar << tar_file_header("lib/foo", "", 0, 100, Time.now)
222
+ corrupt_tar << tar_file_contents("")
223
+
224
+ corrupt_entry = util_entry corrupt_tar
225
+
226
+ assert_raise EOFError do
227
+ corrupt_entry.readpartial(100)
228
+ end
229
+ ensure
230
+ close_util_entry(corrupt_entry) if corrupt_entry
231
+ end
232
+
197
233
  def test_rewind
198
234
  char = @entry.getc
199
235
 
@@ -295,4 +331,20 @@ class TestGemPackageTarReaderEntry < Gem::Package::TarTestCase
295
331
  assert_equal contents2.size, entry.pos
296
332
  end
297
333
  end
334
+
335
+ def test_seek_in_gzip_io_corrupted
336
+ @tar << tar_file_header("lib/bar", "", 0, 100, Time.now)
337
+ @tar << tar_file_contents("")
338
+
339
+ tgz = util_gzip(@tar)
340
+
341
+ Zlib::GzipReader.wrap StringIO.new(tgz) do |gzio|
342
+ util_entry(gzio).close # skip the first entry so io.pos is not 0
343
+ entry = util_entry(gzio)
344
+
345
+ assert_raise EOFError do
346
+ entry.seek(50)
347
+ end
348
+ end
349
+ end
298
350
  end
@@ -28,7 +28,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
28
28
  end
29
29
 
30
30
  def test_add_file
31
- Time.stub :now, Time.at(1458518157) do
31
+ Time.stub :now, Time.at(1_458_518_157) do
32
32
  @tar_writer.add_file "x", 0644 do |f|
33
33
  f.write "a" * 10
34
34
  end
@@ -42,7 +42,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
42
42
 
43
43
  def test_add_file_source_date_epoch
44
44
  ENV["SOURCE_DATE_EPOCH"] = "123456789"
45
- Time.stub :now, Time.at(1458518157) do
45
+ Time.stub :now, Time.at(1_458_518_157) do
46
46
  @tar_writer.mkdir "foo", 0644
47
47
 
48
48
  assert_headers_equal tar_dir_header("foo", "", 0644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc),
@@ -51,7 +51,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
51
51
  end
52
52
 
53
53
  def test_add_symlink
54
- Time.stub :now, Time.at(1458518157) do
54
+ Time.stub :now, Time.at(1_458_518_157) do
55
55
  @tar_writer.add_symlink "x", "y", 0644
56
56
 
57
57
  assert_headers_equal(tar_symlink_header("x", "", 0644, Time.now, "y"),
@@ -62,7 +62,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
62
62
 
63
63
  def test_add_symlink_source_date_epoch
64
64
  ENV["SOURCE_DATE_EPOCH"] = "123456789"
65
- Time.stub :now, Time.at(1458518157) do
65
+ Time.stub :now, Time.at(1_458_518_157) do
66
66
  @tar_writer.add_symlink "x", "y", 0644
67
67
 
68
68
  assert_headers_equal(tar_symlink_header("x", "", 0644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc, "y"),
@@ -73,7 +73,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
73
73
  def test_add_file_digest
74
74
  digest_algorithms = Digest::SHA1.new, Digest::SHA512.new
75
75
 
76
- Time.stub :now, Time.at(1458518157) do
76
+ Time.stub :now, Time.at(1_458_518_157) do
77
77
  digests = @tar_writer.add_file_digest "x", 0644, digest_algorithms do |io|
78
78
  io.write "a" * 10
79
79
  end
@@ -96,7 +96,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
96
96
  def test_add_file_digest_multiple
97
97
  digest_algorithms = [Digest::SHA1.new, Digest::SHA512.new]
98
98
 
99
- Time.stub :now, Time.at(1458518157) do
99
+ Time.stub :now, Time.at(1_458_518_157) do
100
100
  digests = @tar_writer.add_file_digest "x", 0644, digest_algorithms do |io|
101
101
  io.write "a" * 10
102
102
  end
@@ -121,7 +121,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
121
121
 
122
122
  signer = Gem::Security::Signer.new PRIVATE_KEY, [PUBLIC_CERT]
123
123
 
124
- Time.stub :now, Time.at(1458518157) do
124
+ Time.stub :now, Time.at(1_458_518_157) do
125
125
  @tar_writer.add_file_signed "x", 0644, signer do |io|
126
126
  io.write "a" * 10
127
127
  end
@@ -149,7 +149,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
149
149
  def test_add_file_signer_empty
150
150
  signer = Gem::Security::Signer.new nil, nil
151
151
 
152
- Time.stub :now, Time.at(1458518157) do
152
+ Time.stub :now, Time.at(1_458_518_157) do
153
153
  @tar_writer.add_file_signed "x", 0644, signer do |io|
154
154
  io.write "a" * 10
155
155
  end
@@ -163,7 +163,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
163
163
  end
164
164
 
165
165
  def test_add_file_simple
166
- Time.stub :now, Time.at(1458518157) do
166
+ Time.stub :now, Time.at(1_458_518_157) do
167
167
  @tar_writer.add_file_simple "x", 0644, 10 do |io|
168
168
  io.write "a" * 10
169
169
  end
@@ -178,7 +178,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
178
178
 
179
179
  def test_add_file_simple_source_date_epoch
180
180
  ENV["SOURCE_DATE_EPOCH"] = "123456789"
181
- Time.stub :now, Time.at(1458518157) do
181
+ Time.stub :now, Time.at(1_458_518_157) do
182
182
  @tar_writer.add_file_simple "x", 0644, 10 do |io|
183
183
  io.write "a" * 10
184
184
  end
@@ -189,7 +189,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
189
189
  end
190
190
 
191
191
  def test_add_file_simple_padding
192
- Time.stub :now, Time.at(1458518157) do
192
+ Time.stub :now, Time.at(1_458_518_157) do
193
193
  @tar_writer.add_file_simple "x", 0, 100
194
194
 
195
195
  assert_headers_equal tar_file_header("x", "", 0, 100, Time.now),
@@ -247,7 +247,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
247
247
  end
248
248
 
249
249
  def test_mkdir
250
- Time.stub :now, Time.at(1458518157) do
250
+ Time.stub :now, Time.at(1_458_518_157) do
251
251
  @tar_writer.mkdir "foo", 0644
252
252
 
253
253
  assert_headers_equal tar_dir_header("foo", "", 0644, Time.now),
@@ -259,7 +259,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
259
259
 
260
260
  def test_mkdir_source_date_epoch
261
261
  ENV["SOURCE_DATE_EPOCH"] = "123456789"
262
- Time.stub :now, Time.at(1458518157) do
262
+ Time.stub :now, Time.at(1_458_518_157) do
263
263
  @tar_writer.mkdir "foo", 0644
264
264
 
265
265
  assert_headers_equal tar_dir_header("foo", "", 0644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc),