From a0a785ec92ffca87a67b526914a03191cbac193b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Thu, 14 Aug 2025 14:52:42 +0200 Subject: [PATCH] Improve null-safety of cli/spring-boot-cli See gh-46926 --- .../java/org/springframework/boot/cli/SpringCli.java | 5 ++++- .../boot/cli/command/init/ProjectGenerator.java | 4 +++- .../boot/cli/command/shell/RunProcessCommand.java | 10 ++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/SpringCli.java b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/SpringCli.java index d82b3b482ba..19c38045ad0 100644 --- a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/SpringCli.java +++ b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/SpringCli.java @@ -31,6 +31,7 @@ import org.springframework.boot.cli.command.core.HintCommand; import org.springframework.boot.cli.command.core.VersionCommand; import org.springframework.boot.cli.command.shell.ShellCommand; import org.springframework.boot.loader.tools.LogbackInitializer; +import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.SystemPropertyUtils; @@ -84,7 +85,9 @@ public final class SpringCli { String home = SystemPropertyUtils.resolvePlaceholders("${spring.home:${SPRING_HOME:.}}"); File extDirectory = new File(new File(home, "lib"), "ext"); if (extDirectory.isDirectory()) { - for (File file : extDirectory.listFiles()) { + File[] files = extDirectory.listFiles(); + Assert.state(files != null, "'files' must not be null"); + for (File file : files) { if (file.getName().endsWith(".jar")) { try { urls.add(file.toURI().toURL()); diff --git a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerator.java b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerator.java index d574c8c7475..f23a2fdceab 100644 --- a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerator.java +++ b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerator.java @@ -98,7 +98,9 @@ class ProjectGenerator { if (!outputDirectory.exists()) { outputDirectory.mkdirs(); } - try (ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(entity.getContent()))) { + byte[] content = entity.getContent(); + Assert.state(content != null, "'content' must not be null"); + try (ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(content))) { extractFromStream(zipStream, overwrite, outputDirectory); fixExecutableFlag(outputDirectory, "mvnw"); fixExecutableFlag(outputDirectory, "gradlew"); diff --git a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/shell/RunProcessCommand.java b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/shell/RunProcessCommand.java index 4a0514cb07c..1e449d79372 100644 --- a/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/shell/RunProcessCommand.java +++ b/cli/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/shell/RunProcessCommand.java @@ -52,8 +52,9 @@ class RunProcessCommand extends AbstractCommand { } protected ExitStatus run(Collection args) throws IOException { - this.process = new RunProcess(this.command); - int code = this.process.run(true, StringUtils.toStringArray(args)); + RunProcess process = new RunProcess(this.command); + this.process = process; + int code = process.run(true, StringUtils.toStringArray(args)); if (code == 0) { return ExitStatus.OK; } @@ -63,8 +64,9 @@ class RunProcessCommand extends AbstractCommand { } boolean handleSigInt() { - Assert.state(this.process != null, "'process' must not be null"); - return this.process.handleSigInt(); + RunProcess process = this.process; + Assert.state(process != null, "'process' must not be null"); + return process.handleSigInt(); } }