]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10661 minimize normalize calls
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 21 May 2018 07:55:26 +0000 (09:55 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 29 May 2018 07:19:46 +0000 (09:19 +0200)
sonar-plugin-api/src/main/java/org/sonar/api/utils/ZipUtils.java

index 5477600ad5a65ff0a4591f03772663dfb59ac42e..bcb5e10262b6fe22c28bb835718654d3d54fb295 100644 (file)
@@ -85,12 +85,13 @@ public final class ZipUtils {
       FileUtils.forceMkdir(toDir);
     }
 
+    Path targetDirNormalizedPath = toDir.toPath().normalize();
     ZipInputStream zipStream = new ZipInputStream(stream);
     try {
       ZipEntry entry;
       while ((entry = zipStream.getNextEntry()) != null) {
         if (filter.test(entry)) {
-          unzipEntry(entry, zipStream, toDir);
+          unzipEntry(entry, zipStream, targetDirNormalizedPath);
         }
       }
       return toDir;
@@ -100,9 +101,9 @@ public final class ZipUtils {
     }
   }
 
-  private static void unzipEntry(ZipEntry entry, ZipInputStream zipStream, File toDir) throws IOException {
-    File to = new File(toDir, entry.getName());
-    verifyInsideTargetDirectory(entry, to.toPath(), toDir.toPath());
+  private static void unzipEntry(ZipEntry entry, ZipInputStream zipStream, Path targetDirNormalized) throws IOException {
+    File to = targetDirNormalized.resolve(entry.getName()).toFile();
+    verifyInsideTargetDirectory(entry, to.toPath(), targetDirNormalized);
 
     if (entry.isDirectory()) {
       throwExceptionIfDirectoryIsNotCreatable(to);
@@ -245,8 +246,8 @@ public final class ZipUtils {
     }
   }
 
-  private static void verifyInsideTargetDirectory(ZipEntry entry, Path entryPath, Path targetDirPath) {
-    if (!entryPath.normalize().startsWith(targetDirPath.normalize())) {
+  private static void verifyInsideTargetDirectory(ZipEntry entry, Path entryPath, Path targetDirNormalizedPath) {
+    if (!entryPath.normalize().startsWith(targetDirNormalizedPath)) {
       // vulnerability - trying to create a file outside the target directory
       throw new IllegalStateException("Unzipping an entry outside the target directory is not allowed: " + entry.getName());
     }