From 026f46dbcc6f420e31fb34d2d2f4aad156e195bd Mon Sep 17 00:00:00 2001 From: Sergey Vladimirov Date: Sun, 2 Oct 2011 01:06:22 +0000 Subject: [PATCH] always pad properties to 4 bytes fix 51834 - Opening and Writing .doc file results in corrupt document git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1178113 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hpsf/VariantSupport.java | 21 ++++++++---------- .../apache/poi/hwpf/usermodel/TestBugs.java | 19 ++++++++++++++++ test-data/document/Bug51834.doc | Bin 0 -> 47104 bytes 4 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 test-data/document/Bug51834.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index ef8c2d1b71..dcadc73a8d 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 51834 - Opening and Writing .doc file results in corrupt document 51902 - Picture.fillRawImageContent - ArrayIndexOutOfBoundsException (duplicate) 51890 - ArrayIndexOutOfBounds ExceptionPicture.fillRawImageContent Allow the passing of a File object to WorkbookFactory.create, which permits lower memory processing than the InputStream version diff --git a/src/java/org/apache/poi/hpsf/VariantSupport.java b/src/java/org/apache/poi/hpsf/VariantSupport.java index 1075a9cf8b..af7347b714 100644 --- a/src/java/org/apache/poi/hpsf/VariantSupport.java +++ b/src/java/org/apache/poi/hpsf/VariantSupport.java @@ -482,8 +482,7 @@ public class VariantSupport extends Variant else trueOrFalse = (short) 0x0000; TypeWriter.writeUShortToStream( out, trueOrFalse ); - TypeWriter.writeUShortToStream( out, (short) 0x0000 ); - length += 4; + length += 2; break; } case Variant.VT_LPSTR: @@ -515,9 +514,6 @@ public class VariantSupport extends Variant out.write(highb); length += 2; } - out.write(0x00); - out.write(0x00); - length += 2; break; } case Variant.VT_CF: @@ -536,13 +532,7 @@ public class VariantSupport extends Variant case Variant.VT_I2: { TypeWriter.writeToStream(out, ((Integer) value).shortValue()); - // length = LittleEndianConsts.SHORT_SIZE; - TypeWriter.writeToStream( out, (short) 0x0000 ); - /* - * MUST be a 16-bit signed integer, followed by zero padding to 4 - * bytes -- http://msdn.microsoft.com/en-us/library/dd942532(v=PROT.13).aspx - */ - length = LittleEndianConsts.INT_SIZE; + length = LittleEndianConsts.SHORT_SIZE; break; } case Variant.VT_I4: @@ -599,6 +589,13 @@ public class VariantSupport extends Variant } } + /* pad values to 4-bytes */ + while ( ( length & 0x3 ) != 0 ) + { + out.write( 0x00 ); + length++; + } + return length; } } diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java index 50b6e52798..686f29706c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java @@ -17,7 +17,9 @@ package org.apache.poi.hwpf.usermodel; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -25,6 +27,7 @@ import java.util.Collection; import java.util.List; import junit.framework.TestCase; + import org.apache.commons.codec.digest.DigestUtils; import org.apache.poi.POIDataSamples; import org.apache.poi.hwpf.HWPFDocument; @@ -38,6 +41,7 @@ import org.apache.poi.hwpf.model.PlexOfField; import org.apache.poi.hwpf.model.SubdocumentType; import org.apache.poi.hwpf.model.io.HWPFOutputStream; import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.IOUtils; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -700,4 +704,19 @@ public class TestBugs extends TestCase + " has type " + pictureType ); } } + + /** + * [RESOLVED FIXED] Bug 51834 - Opening and Writing .doc file results in + * corrupt document + */ + public void testBug51834() throws Exception + { + /* + * we don't have Java test for this file - it should be checked using + * Microsoft BFF Validator. But check read-write-read anyway. -- sergey + */ + HWPFTestDataSamples.openSampleFile( "Bug51834.doc" ); + HWPFTestDataSamples.writeOutAndReadBack( HWPFTestDataSamples + .openSampleFile( "Bug51834.doc" ) ); + } } diff --git a/test-data/document/Bug51834.doc b/test-data/document/Bug51834.doc new file mode 100644 index 0000000000000000000000000000000000000000..c1628251dd446b90da11934e1213a68c8fe2a42c GIT binary patch literal 47104 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