This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git
The following commit(s) were added to refs/heads/master by this push: new 0945bcb [MSHADE-417] Fix null bytes appended to small files (#160) 0945bcb is described below commit 0945bcbcefd1144029f86da51a09bd8a805bd158 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Thu Oct 20 22:36:17 2022 +0200 [MSHADE-417] Fix null bytes appended to small files (#160) * Fix MSHADE-417 * don't unread when nothing was read * Add a unit test Co-authored-by: NichtStudioCode <51272202+nichtstudioc...@users.noreply.github.com> --- .../apache/maven/plugins/shade/DefaultShader.java | 7 ++-- .../maven/plugins/shade/DefaultShaderTest.java | 39 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java index defa123..c646cc7 100644 --- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java +++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java @@ -181,8 +181,11 @@ public class DefaultShader public boolean hasZipHeader() throws IOException { final byte[] header = new byte[HEADER_LEN]; - super.read( header, 0, HEADER_LEN ); - super.unread( header ); + int len = super.read( header, 0, HEADER_LEN ); + if ( len != -1 ) + { + super.unread( header, 0, len ); + } return Arrays.equals( header, ZIP_HEADER ); } } diff --git a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java index b6a8728..14786ec 100644 --- a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java +++ b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java @@ -477,6 +477,45 @@ public class DefaultShaderTest temporaryFolder.delete(); } + @Test + public void testShaderWithSmallEntries() throws Exception + { + TemporaryFolder temporaryFolder = new TemporaryFolder(); + + final String innerJarFileName = "inner.jar"; + int len; + + temporaryFolder.create(); + File innerJar = temporaryFolder.newFile( innerJarFileName ); + try ( JarOutputStream jos = new JarOutputStream( new FileOutputStream( innerJar ) ) ) + { + jos.putNextEntry( new JarEntry( "foo.txt" ) ); + byte[] bytes = "c1".getBytes(StandardCharsets.UTF_8); + len = bytes.length; + jos.write( bytes ); + jos.closeEntry(); + } + + ShadeRequest shadeRequest = new ShadeRequest(); + shadeRequest.setJars( new LinkedHashSet<>( Collections.singleton( innerJar ) ) ); + shadeRequest.setFilters( new ArrayList<Filter>() ); + shadeRequest.setRelocators( new ArrayList<Relocator>() ); + shadeRequest.setResourceTransformers( new ArrayList<ResourceTransformer>() ); + File shadedFile = temporaryFolder.newFile( "shaded.jar" ); + shadeRequest.setUberJar( shadedFile ); + + DefaultShader shader = newShader(); + shader.shade( shadeRequest ); + + JarFile shadedJarFile = new JarFile( shadedFile ); + JarEntry entry = shadedJarFile.getJarEntry( "foo.txt" ); + + //After shading, entry compression method should not be changed. + Assert.assertEquals( entry.getSize(), len ); + + temporaryFolder.delete(); + } + private void writeEntryWithoutCompression( String entryName, byte[] entryBytes, JarOutputStream jos ) throws IOException { final JarEntry entry = new JarEntry( entryName );