Skip to content

Commit 0945bcb

Browse files
[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+NichtStudioCode@users.noreply.github.com>
1 parent 41bd72f commit 0945bcb

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,11 @@ protected ZipHeaderPeekInputStream( InputStream in )
181181
public boolean hasZipHeader() throws IOException
182182
{
183183
final byte[] header = new byte[HEADER_LEN];
184-
super.read( header, 0, HEADER_LEN );
185-
super.unread( header );
184+
int len = super.read( header, 0, HEADER_LEN );
185+
if ( len != -1 )
186+
{
187+
super.unread( header, 0, len );
188+
}
186189
return Arrays.equals( header, ZIP_HEADER );
187190
}
188191
}

src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java

+39
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,45 @@ public void testShaderWithDuplicateService() throws Exception
477477
temporaryFolder.delete();
478478
}
479479

480+
@Test
481+
public void testShaderWithSmallEntries() throws Exception
482+
{
483+
TemporaryFolder temporaryFolder = new TemporaryFolder();
484+
485+
final String innerJarFileName = "inner.jar";
486+
int len;
487+
488+
temporaryFolder.create();
489+
File innerJar = temporaryFolder.newFile( innerJarFileName );
490+
try ( JarOutputStream jos = new JarOutputStream( new FileOutputStream( innerJar ) ) )
491+
{
492+
jos.putNextEntry( new JarEntry( "foo.txt" ) );
493+
byte[] bytes = "c1".getBytes(StandardCharsets.UTF_8);
494+
len = bytes.length;
495+
jos.write( bytes );
496+
jos.closeEntry();
497+
}
498+
499+
ShadeRequest shadeRequest = new ShadeRequest();
500+
shadeRequest.setJars( new LinkedHashSet<>( Collections.singleton( innerJar ) ) );
501+
shadeRequest.setFilters( new ArrayList<Filter>() );
502+
shadeRequest.setRelocators( new ArrayList<Relocator>() );
503+
shadeRequest.setResourceTransformers( new ArrayList<ResourceTransformer>() );
504+
File shadedFile = temporaryFolder.newFile( "shaded.jar" );
505+
shadeRequest.setUberJar( shadedFile );
506+
507+
DefaultShader shader = newShader();
508+
shader.shade( shadeRequest );
509+
510+
JarFile shadedJarFile = new JarFile( shadedFile );
511+
JarEntry entry = shadedJarFile.getJarEntry( "foo.txt" );
512+
513+
//After shading, entry compression method should not be changed.
514+
Assert.assertEquals( entry.getSize(), len );
515+
516+
temporaryFolder.delete();
517+
}
518+
480519
private void writeEntryWithoutCompression( String entryName, byte[] entryBytes, JarOutputStream jos ) throws IOException
481520
{
482521
final JarEntry entry = new JarEntry( entryName );

0 commit comments

Comments
 (0)