From beff874b2977895ca200e8706e31978f0e0a5fb6 Mon Sep 17 00:00:00 2001 From: Tiago Quelhas Date: Wed, 8 Nov 2023 15:28:00 +0100 Subject: [PATCH] Fix extraction of tar archives containing sparse files. By upgrading the Apache Commons Compress library to 1.20. I'm deliberately not upgrading to the most recent one (1.24.0) because it would require an additional JDK module (java.desktop) and significantly regress the binary size. Fixes #20090. --- MODULE.bazel | 2 +- MODULE.bazel.lock | 25 +++-------- maven_install.json | 8 ++-- .../bazel/bazel_external_repository_test.py | 42 +++++++++++++++++- .../sparse_archive.tar | Bin 0 -> 10240 bytes 5 files changed, 52 insertions(+), 25 deletions(-) create mode 100644 src/test/py/bazel/testdata/bazel_external_repository_test/sparse_archive.tar diff --git a/MODULE.bazel b/MODULE.bazel index f284548d51a126..f1d22d4d5063de 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -143,7 +143,7 @@ maven.install( "javax.inject:javax.inject:1", "net.bytebuddy:byte-buddy-agent:1.14.5", "net.bytebuddy:byte-buddy:1.14.5", - "org.apache.commons:commons-compress:1.19", + "org.apache.commons:commons-compress:1.20", "org.apache.commons:commons-pool2:2.8.0", "org.apache.tomcat:tomcat-annotations-api:8.0.5", "org.apache.velocity:velocity:1.7", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 17a7e32cf7575c..a2c5c4639ad20d 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1,6 +1,6 @@ { "lockFileVersion": 3, - "moduleFileHash": "c5d58b15a93a652e3ec10fb6d5084763df54327dd81da2185cad8d5b9db5b947", + "moduleFileHash": "93aebd3a9f96d5d6e6148fc4ccd29b673d842f81a91eb2494a3008f4c2c56504", "flags": { "cmdRegistries": [ "https://bcr.bazel.build/" @@ -132,7 +132,7 @@ "javax.inject:javax.inject:1", "net.bytebuddy:byte-buddy-agent:1.14.5", "net.bytebuddy:byte-buddy:1.14.5", - "org.apache.commons:commons-compress:1.19", + "org.apache.commons:commons-compress:1.20", "org.apache.commons:commons-pool2:2.8.0", "org.apache.tomcat:tomcat-annotations-api:8.0.5", "org.apache.velocity:velocity:1.7", @@ -2180,7 +2180,7 @@ "bzlTransitiveDigest": "U0PdF0Y6pi1ibjV47I9znaKyMppoEOhJX/RSf+0SYm8=", "accumulatedFileDigests": { "@@//src/test/tools/bzlmod:MODULE.bazel.lock": "57004ac9cc0c88944c08f5156a299addbe3ff1caa9209ec0809edda9a4315b31", - "@@//:MODULE.bazel": "c5d58b15a93a652e3ec10fb6d5084763df54327dd81da2185cad8d5b9db5b947" + "@@//:MODULE.bazel": "93aebd3a9f96d5d6e6148fc4ccd29b673d842f81a91eb2494a3008f4c2c56504" }, "envVariables": {}, "generatedRepoSpecs": { @@ -4241,7 +4241,7 @@ "general": { "bzlTransitiveDigest": "WAWsskOl4eHIskcL0TuHZGIMjV8sMJaAbAo2luMqofo=", "accumulatedFileDigests": { - "@@//:maven_install.json": "b71927a70eb335e49b005049b79bec6833b4e7d00245a46d1de8c226b49ec009", + "@@//:maven_install.json": "52c0fa6f02e2586937be9b90917383c9cd9ac8dc577105c73513b02104e731a2", "@@rules_jvm_external~5.2//:rules_jvm_external_deps_install.json": "3ab1f67b0de4815df110bc72ccd6c77882b3b21d3d1e0a84445847b6ce3235a3", "@@//src/tools/android:maven_android_install.json": "09bff3e33d291336046f7c9201630fb5e014f0e60b78b6f09b84e4f5f73ed04f" }, @@ -4824,7 +4824,7 @@ "{ \"group\": \"javax.inject\", \"artifact\": \"javax.inject\", \"version\": \"1\" }", "{ \"group\": \"net.bytebuddy\", \"artifact\": \"byte-buddy-agent\", \"version\": \"1.14.5\" }", "{ \"group\": \"net.bytebuddy\", \"artifact\": \"byte-buddy\", \"version\": \"1.14.5\" }", - "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-compress\", \"version\": \"1.19\" }", + "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-compress\", \"version\": \"1.20\" }", "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-pool2\", \"version\": \"2.8.0\" }", "{ \"group\": \"org.apache.tomcat\", \"artifact\": \"tomcat-annotations-api\", \"version\": \"8.0.5\" }", "{ \"group\": \"org.apache.velocity\", \"artifact\": \"velocity\", \"version\": \"1.7\" }", @@ -5572,7 +5572,6 @@ "name": "rules_jvm_external~5.2~maven~org_apache_commons_commons_compress_1_20", "sha256": "0aeb625c948c697ea7b205156e112363b59ed5e2551212cd4e460bdb72c7c06e", "urls": [ - "https://dl.google.com/android/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar", "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar" ], "downloaded_file_path": "org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar" @@ -5831,18 +5830,6 @@ "downloaded_file_path": "com/google/guava/guava/32.1.1-jre/guava-32.1.1-jre.jar" } }, - "org_apache_commons_commons_compress_1_19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "name": "rules_jvm_external~5.2~maven~org_apache_commons_commons_compress_1_19", - "sha256": "ff2d59fad74e867630fbc7daab14c432654712ac624dbee468d220677b124dd5", - "urls": [ - "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" - ], - "downloaded_file_path": "org/apache/commons/commons-compress/1.19/commons-compress-1.19.jar" - } - }, "com_android_tools_sdklib_30_1_3": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", @@ -7372,7 +7359,7 @@ "{ \"group\": \"javax.inject\", \"artifact\": \"javax.inject\", \"version\": \"1\" }", "{ \"group\": \"net.bytebuddy\", \"artifact\": \"byte-buddy-agent\", \"version\": \"1.14.5\" }", "{ \"group\": \"net.bytebuddy\", \"artifact\": \"byte-buddy\", \"version\": \"1.14.5\" }", - "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-compress\", \"version\": \"1.19\" }", + "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-compress\", \"version\": \"1.20\" }", "{ \"group\": \"org.apache.commons\", \"artifact\": \"commons-pool2\", \"version\": \"2.8.0\" }", "{ \"group\": \"org.apache.tomcat\", \"artifact\": \"tomcat-annotations-api\", \"version\": \"8.0.5\" }", "{ \"group\": \"org.apache.velocity\", \"artifact\": \"velocity\", \"version\": \"1.7\" }", diff --git a/maven_install.json b/maven_install.json index 7a415a04f59033..35beebfa1b7490 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -271381572, - "__RESOLVED_ARTIFACTS_HASH": -474976451, + "__INPUT_ARTIFACTS_HASH": 1383287746, + "__RESOLVED_ARTIFACTS_HASH": -1510367107, "conflict_resolution": { "com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.9.0", "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.23.0", @@ -570,9 +570,9 @@ }, "org.apache.commons:commons-compress": { "shasums": { - "jar": "ff2d59fad74e867630fbc7daab14c432654712ac624dbee468d220677b124dd5" + "jar": "0aeb625c948c697ea7b205156e112363b59ed5e2551212cd4e460bdb72c7c06e" }, - "version": "1.19" + "version": "1.20" }, "org.apache.commons:commons-pool2": { "shasums": { diff --git a/src/test/py/bazel/bazel_external_repository_test.py b/src/test/py/bazel/bazel_external_repository_test.py index 4f7279a73941a5..52be99a5cbf01e 100644 --- a/src/test/py/bazel/bazel_external_repository_test.py +++ b/src/test/py/bazel/bazel_external_repository_test.py @@ -51,7 +51,7 @@ def setUp(self): test_base.TestBase.setUp(self) for f in [ 'six-1.10.0.tar.gz', 'archive_with_symlink.zip', - 'archive_with_symlink.tar.gz' + 'archive_with_symlink.tar.gz', 'sparse_archive.tar', ]: self.CopyFile(self.Rlocation('io_bazel/src/test/py/bazel/testdata/' 'bazel_external_repository_test/' + f), f) @@ -162,6 +162,46 @@ def testNewHttpTarArchiveWithSymlinks(self): '@archive_with_symlink//:file-A', ]) + def testNewHttpTarWithSparseFile(self): + # Test extraction of tar archives containing sparse files. + # The archive under test was produced using GNU tar on Linux: + # truncate -s 1M sparse_file + # tar --create --sparse --format posix --file sparse_archive.tar sparse_file + + ip, port = self._http_server.server_address + rule_definition = [ + 'load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")', + 'http_archive(', + ' name = "sparse_archive",', + ' urls = ["http://%s:%s/sparse_archive.tar"],' % (ip, port), + ' build_file = "@//:sparse_archive.BUILD",', + ' sha256 = ', + ' "a1a2b2ce4acd51a8cc1ab80adce6f134ac73e885219911a960a42000e312bb65",' + ')', + ] + rule_definition.extend(self.GetDefaultRepoRules()) + self.ScratchFile('WORKSPACE', rule_definition) + self.ScratchFile('sparse_archive.BUILD', [ + 'exports_files(["sparse_file"])', + ]) + self.ScratchFile('test.py', [ + 'import sys', + 'if open(sys.argv[1], "rb").read() != b"\\0"*1024*1024:', + ' sys.exit(1)', + ]) + self.ScratchFile('BUILD', [ + 'py_test(', + ' name = "test",', + ' srcs = ["test.py"],', + ' args = ["$(location @sparse_archive//:sparse_file)"],' + ' data = ["@sparse_archive//:sparse_file"],' + ')', + ]) + self.RunBazel([ + 'test', + '//:test', + ]) + def _CreatePyWritingStarlarkRule(self, print_string): self.ScratchFile('repo/foo.bzl', [ 'def _impl(ctx):', diff --git a/src/test/py/bazel/testdata/bazel_external_repository_test/sparse_archive.tar b/src/test/py/bazel/testdata/bazel_external_repository_test/sparse_archive.tar new file mode 100644 index 0000000000000000000000000000000000000000..693e027a62bb43007d6cf5f892eb9bc7d00509bd GIT binary patch literal 10240 zcmeIyQBQ*~5C`x+^C|cQa957P9(YxsjEV8tG+Gyyv0-7!^wV23B$JFiO|vZjzLfM1 za{ZNSl0Mk|owKjbcWKvJ-?`_vdhOI12Zdoo)G&uJohc(xEVzs{>_h+nO z_EWpAw?33Kn{eF$t>fGKr{w44lg6&LzT#-IT5rNCMHwIFZfxVKgFj{x_Rg-m`qNcR zQs#w;GK!nN4)3s8EF|ZWB%zXvoF$VXYEMRA=A+krLVvrvBn`*^_}%w6q3si)LYHjL zdKC;!Z-i86Yn=%z(s>b{#(RK=JKD literal 0 HcmV?d00001