Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NegativeArraySizeException can be thrown from org.springframework.boot.loader.zip.ZipContent$Loader #38572

Closed
rubensa opened this issue Nov 27, 2023 · 2 comments
Assignees
Labels
type: regression A regression from a previous release
Milestone

Comments

@rubensa
Copy link

rubensa commented Nov 27, 2023

Under Spring Boot 3.2.x I get a java.lang.NegativeArraySizeException exception from org.springframework.boot.loader.zip.ZipContent$Loader when running:

java -Djarmode=layertools -jar target/*.jar extract --destination target/extracted

if the project has snowflake-jdbc 3.14.x as a dependency.

If I use Spring Boot 3.1.x it works without problem.

If I downgrade snowflake-jdbc to version 3.13.x it also works on Spring Boot 3.2.x without problem.

I checked both with Java 21 and Java 17 with same results.

In https://github.com/rubensa/layertools you can find a sample repo showing the problem (based in VSCode with Dev Containers -you need to switch to Language Support for Java(TM) by Red Hat pre-release extension version as Java 21 is not yet officially supported-).

If you run build.sh in main branch (Java 21, Spring Boot 3.2.0 and snowflake-jdbc 3.14.3) you get:

[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.3.2:clean (default-clean) @ layertools ---
[INFO] Deleting /workspaces/layertools/target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.166 s
[INFO] Finished at: 2023-11-27T17:17:09Z
[INFO] ------------------------------------------------------------------------
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ layertools ---
[INFO] skip non existing resourceDirectory /workspaces/layertools/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/test-classes
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ layertools ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.eu.rubensa.layertools.LayertoolsApplicationTests
17:17:11.755 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [org.eu.rubensa.layertools.LayertoolsApplicationTests]: LayertoolsApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
17:17:11.810 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration org.eu.rubensa.layertools.LayertoolsApplication for test class org.eu.rubensa.layertools.LayertoolsApplicationTests

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.0)

2023-11-27T17:17:12.017Z  INFO 3061 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Starting LayertoolsApplicationTests using Java 21.0.1 with PID 3061 (started by user in /workspaces/layertools)
2023-11-27T17:17:12.018Z  INFO 3061 --- [           main] o.e.r.l.LayertoolsApplicationTests       : No active profile set, falling back to 1 default profile: "default"
2023-11-27T17:17:12.564Z  INFO 3061 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Started LayertoolsApplicationTests in 0.695 seconds (process running for 1.249)
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
WARNING: A Java agent has been loaded dynamically (/home/user/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.10/byte-buddy-agent-1.14.10.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.468 s -- in org.eu.rubensa.layertools.LayertoolsApplicationTests
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ layertools ---
[INFO] Building jar: /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- spring-boot:3.2.0:repackage (repackage) @ layertools ---
[INFO] Replacing main artifact /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.782 s
[INFO] Finished at: 2023-11-27T17:17:13Z
[INFO] ------------------------------------------------------------------------
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
        at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
Caused by: java.lang.NegativeArraySizeException: -31658
        at org.springframework.boot.loader.zip.ZipContent$Loader.<init>(ZipContent.java:435)
        at org.springframework.boot.loader.zip.ZipContent$Loader.loadContent(ZipContent.java:565)
        at org.springframework.boot.loader.zip.ZipContent$Loader.openAndLoad(ZipContent.java:543)
        at org.springframework.boot.loader.zip.ZipContent$Loader.loadNestedZip(ZipContent.java:537)
        at org.springframework.boot.loader.zip.ZipContent$Loader.load(ZipContent.java:522)
        at org.springframework.boot.loader.zip.ZipContent.open(ZipContent.java:372)
        at org.springframework.boot.loader.zip.ZipContent.open(ZipContent.java:361)
        at org.springframework.boot.loader.jar.NestedJarFileResources.<init>(NestedJarFileResources.java:57)
        at org.springframework.boot.loader.jar.NestedJarFile.<init>(NestedJarFile.java:141)
        at org.springframework.boot.loader.jar.NestedJarFile.<init>(NestedJarFile.java:120)
        at org.springframework.boot.loader.net.protocol.jar.UrlNestedJarFile.<init>(UrlNestedJarFile.java:42)
        at org.springframework.boot.loader.net.protocol.jar.UrlJarFileFactory.createJarFileForNested(UrlJarFileFactory.java:86)
        at org.springframework.boot.loader.net.protocol.jar.UrlJarFileFactory.createJarFile(UrlJarFileFactory.java:55)
        at org.springframework.boot.loader.net.protocol.jar.UrlJarFiles.getOrCreate(UrlJarFiles.java:72)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlConnection.connect(JarUrlConnection.java:289)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlConnection.getJarFile(JarUrlConnection.java:99)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.getJarFile(JarUrlClassLoader.java:185)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.definePackage(JarUrlClassLoader.java:143)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.definePackageIfNecessary(JarUrlClassLoader.java:126)
        at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.loadClass(JarUrlClassLoader.java:99)
        at org.springframework.boot.loader.launch.LaunchedClassLoader.loadClass(LaunchedClassLoader.java:91)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at org.springframework.boot.loader.launch.JarModeRunner.main(JarModeRunner.java:40)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        ... 4 more

If you run build.sh in java-21-spring-boot-3.2.x-snowflake-jdbc-3.13.x branch (Java 21, Spring Boot 3.2.0 and snowflake-jdbc 3.13.33) you get:

[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.3.2:clean (default-clean) @ layertools ---
[INFO] Deleting /workspaces/layertools/target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.264 s
[INFO] Finished at: 2023-11-27T17:17:54Z
[INFO] ------------------------------------------------------------------------
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ layertools ---
[INFO] skip non existing resourceDirectory /workspaces/layertools/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/test-classes
[INFO] 
[INFO] --- surefire:3.1.2:test (default-test) @ layertools ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.eu.rubensa.layertools.LayertoolsApplicationTests
17:17:57.337 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [org.eu.rubensa.layertools.LayertoolsApplicationTests]: LayertoolsApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
17:17:57.398 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration org.eu.rubensa.layertools.LayertoolsApplication for test class org.eu.rubensa.layertools.LayertoolsApplicationTests

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.0)

2023-11-27T17:17:57.593Z  INFO 3634 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Starting LayertoolsApplicationTests using Java 21.0.1 with PID 3634 (started by user in /workspaces/layertools)
2023-11-27T17:17:57.594Z  INFO 3634 --- [           main] o.e.r.l.LayertoolsApplicationTests       : No active profile set, falling back to 1 default profile: "default"
2023-11-27T17:17:58.173Z  INFO 3634 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Started LayertoolsApplicationTests in 0.708 seconds (process running for 1.274)
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
WARNING: A Java agent has been loaded dynamically (/home/user/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.10/byte-buddy-agent-1.14.10.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.453 s -- in org.eu.rubensa.layertools.LayertoolsApplicationTests
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ layertools ---
[INFO] Building jar: /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- spring-boot:3.2.0:repackage (repackage) @ layertools ---
[INFO] Replacing main artifact /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.641 s
[INFO] Finished at: 2023-11-27T17:17:59Z
[INFO] ------------------------------------------------------------------------

If you run build.sh in java-21-spring-boot-3.1.x-snowflake-3.14.x branch (Java 21, Spring Boot 3.1.5 and snowflake-jdbc 3.14.x) you get:

[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.2.0:clean (default-clean) @ layertools ---
[INFO] Deleting /workspaces/layertools/target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.368 s
[INFO] Finished at: 2023-11-27T17:18:54Z
[INFO] ------------------------------------------------------------------------
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.eu.rubensa:layertools >----------------------
[INFO] Building layertools 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ layertools ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ layertools ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ layertools ---
[INFO] skip non existing resourceDirectory /workspaces/layertools/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ layertools ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 1 source file with javac [debug release 21] to target/test-classes
[INFO] 
[INFO] --- surefire:3.0.0:test (default-test) @ layertools ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.eu.rubensa.layertools.LayertoolsApplicationTests
17:18:57.857 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [org.eu.rubensa.layertools.LayertoolsApplicationTests]: LayertoolsApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
17:18:57.926 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration org.eu.rubensa.layertools.LayertoolsApplication for test class org.eu.rubensa.layertools.LayertoolsApplicationTests

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-27T17:18:58.241Z  INFO 4612 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Starting LayertoolsApplicationTests using Java 21.0.1 with PID 4612 (started by user in /workspaces/layertools)
2023-11-27T17:18:58.243Z  INFO 4612 --- [           main] o.e.r.l.LayertoolsApplicationTests       : No active profile set, falling back to 1 default profile: "default"
2023-11-27T17:18:59.031Z  INFO 4612 --- [           main] o.e.r.l.LayertoolsApplicationTests       : Started LayertoolsApplicationTests in 1.014 seconds (process running for 1.727)
WARNING: A Java agent has been loaded dynamically (/home/user/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.955 s - in org.eu.rubensa.layertools.LayertoolsApplicationTests
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- jar:3.3.0:jar (default-jar) @ layertools ---
[INFO] Building jar: /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- spring-boot:3.1.5:repackage (repackage) @ layertools ---
[INFO] Replacing main artifact /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to /workspaces/layertools/target/layertools-0.0.1-SNAPSHOT.jar.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.992 s
[INFO] Finished at: 2023-11-27T17:19:00Z
[INFO] ------------------------------------------------------------------------

You can run the same using Java 17 from java-17-xxx branches with same results.

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Nov 27, 2023
@philwebb philwebb added type: regression A regression from a previous release and removed status: waiting-for-triage An issue we've not yet triaged labels Nov 28, 2023
@philwebb philwebb added this to the 3.2.1 milestone Nov 28, 2023
@philwebb philwebb self-assigned this Nov 28, 2023
@philwebb philwebb changed the title java.lang.NegativeArraySizeException on org.springframework.boot.loader.zip.ZipContent$Loader NegativeArraySizeException can be thrown from org.springframework.boot.loader.zip.ZipContent$Loader Nov 28, 2023
@philwebb
Copy link
Member

Thanks very much for the sample @rubensa. This was caused by a missing short -> unsigned int conversion.

@davidfritch
Copy link

I just wanted to second that I saw this same error running spring-boot 3.2.0 as a .war. When I ran it using the 3.2.1-SNAPSHOT it was not happening anymore.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: regression A regression from a previous release
Projects
None yet
Development

No branches or pull requests

4 participants