]> source.dussan.org Git - poi.git/commitdiff
some files has strange property values... try to handle them.
authorSergey Vladimirov <sergey@apache.org>
Sat, 22 Oct 2011 02:23:19 +0000 (02:23 +0000)
committerSergey Vladimirov <sergey@apache.org>
Sat, 22 Oct 2011 02:23:19 +0000 (02:23 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1187644 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hpsf/CodePageString.java
src/java/org/apache/poi/hpsf/UnicodeString.java

index 3fe4fec9a06bdb5f2bfff5079f9bae96bf1dc6b3..110961ba67d231c15ae237ede471efb49ea29fe7 100644 (file)
@@ -22,11 +22,16 @@ import java.io.UnsupportedEncodingException;
 
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 @Internal
 class CodePageString
 {
 
+    private final static POILogger logger = POILogFactory
+            .getLogger( CodePageString.class );
+
     private static String codepageToEncoding( final int codepage )
             throws UnsupportedEncodingException
     {
@@ -172,7 +177,23 @@ class CodePageString
             result = new String( _value );
         else
             result = new String( _value, codepageToEncoding( codepage ) );
-        return result.substring( 0, result.length() - 1 );
+        final int terminator = result.indexOf( '\0' );
+        if ( terminator == -1 )
+        {
+            logger.log(
+                    POILogger.WARN,
+                    "String terminator (\\0) for CodePageString property value not found."
+                            + "Continue without trimming and hope for the best." );
+            return result;
+        }
+        if ( terminator != result.length() - 1 )
+        {
+            logger.log(
+                    POILogger.WARN,
+                    "String terminator (\\0) for CodePageString property value occured before the end of string. "
+                            + "Trimming and hope for the best." );
+        }
+        return result.substring( 0, terminator );
     }
 
     int getSize()
index dbb82528a24211c9fc3899f0f458aad8d72e37b9..38c3ad49458ecb6211f6a648202fc3a8c6d19383 100644 (file)
@@ -18,11 +18,17 @@ package org.apache.poi.hpsf;
 
 import org.apache.poi.util.Internal;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 import org.apache.poi.util.StringUtil;
 
 @Internal
 class UnicodeString
 {
+
+    private final static POILogger logger = POILogFactory
+            .getLogger( UnicodeString.class );
+
     private byte[] _value;
 
     UnicodeString( byte[] data, int offset )
@@ -59,7 +65,25 @@ class UnicodeString
         if ( _value.length == 0 )
             return null;
 
-        return StringUtil.getFromUnicodeLE( _value, 0,
-                ( _value.length - 2 ) >> 1 );
+        String result = StringUtil.getFromUnicodeLE( _value, 0,
+                _value.length >> 1 );
+
+        final int terminator = result.indexOf( '\0' );
+        if ( terminator == -1 )
+        {
+            logger.log(
+                    POILogger.WARN,
+                    "String terminator (\\0) for UnicodeString property value not found."
+                            + "Continue without trimming and hope for the best." );
+            return result;
+        }
+        if ( terminator != result.length() - 1 )
+        {
+            logger.log(
+                    POILogger.WARN,
+                    "String terminator (\\0) for UnicodeString property value occured before the end of string. "
+                            + "Trimming and hope for the best." );
+        }
+        return result.substring( 0, terminator );
     }
 }