You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2016/06/07 16:24:27 UTC

commons-compress git commit: COMPRESS-351 restrict length of sanitized entry name

Repository: commons-compress
Updated Branches:
  refs/heads/master 593339ab6 -> 11840dfde


COMPRESS-351 restrict length of sanitized entry name


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/11840dfd
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/11840dfd
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/11840dfd

Branch: refs/heads/master
Commit: 11840dfde044fec90b0cb4a715ce9d213acea3ca
Parents: 593339a
Author: Stefan Bodewig <bo...@apache.org>
Authored: Tue Jun 7 18:23:48 2016 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Tue Jun 7 18:23:48 2016 +0200

----------------------------------------------------------------------
 .../apache/commons/compress/utils/ArchiveUtils.java  | 14 ++++++++++++--
 .../apache/commons/compress/ArchiveUtilsTest.java    | 15 +++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/11840dfd/src/main/java/org/apache/commons/compress/utils/ArchiveUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/utils/ArchiveUtils.java b/src/main/java/org/apache/commons/compress/utils/ArchiveUtils.java
index 107bf0b..cd0165f 100644
--- a/src/main/java/org/apache/commons/compress/utils/ArchiveUtils.java
+++ b/src/main/java/org/apache/commons/compress/utils/ArchiveUtils.java
@@ -19,6 +19,7 @@
 package org.apache.commons.compress.utils;
 
 import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
 
 import org.apache.commons.compress.archivers.ArchiveEntry;
 
@@ -27,6 +28,8 @@ import org.apache.commons.compress.archivers.ArchiveEntry;
  */
 public class ArchiveUtils {
 
+    private static final int MAX_SANITIZED_NAME_LENGTH = 255;
+
     /** Private constructor to prevent instantiation of this utility class. */
     private ArchiveUtils(){
     }
@@ -255,7 +258,8 @@ public class ArchiveUtils {
     /**
      * Returns a "sanitized" version of the string given as arguments,
      * where sanitized means non-printable characters have been
-     * replaced with a question mark.
+     * replaced with a question mark and the outcome is not longer
+     * than 255 chars.
      *
      * <p>This method is used to clean up file names when they are
      * used in exception messages as they may end up in log files or
@@ -267,7 +271,13 @@ public class ArchiveUtils {
      * @since Compress 1.12
      */
     public static String sanitize(String s) {
-        final char[] chars = s.toCharArray();
+        final char[] cs = s.toCharArray();
+        final char[] chars = cs.length <= MAX_SANITIZED_NAME_LENGTH ? cs : Arrays.copyOf(cs, MAX_SANITIZED_NAME_LENGTH);
+        if (cs.length > MAX_SANITIZED_NAME_LENGTH) {
+            for (int i = MAX_SANITIZED_NAME_LENGTH - 3; i < MAX_SANITIZED_NAME_LENGTH; i++) {
+                chars[i] = '.';
+            }
+        }
         final int len = chars.length;
         final StringBuilder sb = new StringBuilder();
         for (int i = 0; i < len; i++) {

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/11840dfd/src/test/java/org/apache/commons/compress/ArchiveUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/compress/ArchiveUtilsTest.java b/src/test/java/org/apache/commons/compress/ArchiveUtilsTest.java
index 413b52b..db383ed 100644
--- a/src/test/java/org/apache/commons/compress/ArchiveUtilsTest.java
+++ b/src/test/java/org/apache/commons/compress/ArchiveUtilsTest.java
@@ -67,6 +67,21 @@ public class ArchiveUtilsTest extends AbstractTestCase {
         asciiToByteAndBackFail("\u8025");
     }
 
+    @Test
+    public void sanitizeShortensString() {
+        String input = "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789";
+        String expected = "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901234567890123456789012345678901234567890123456789"
+            + "012345678901...";
+        assertEquals(expected, ArchiveUtils.sanitize(input));
+    }
+
     private void asciiToByteAndBackOK(final String inputString) {
         assertEquals(inputString, ArchiveUtils.toAsciiString(ArchiveUtils.toAsciiBytes(inputString)));
     }