]> source.dussan.org Git - poi.git/commitdiff
[bug-66590] Number of blocks used by the property table missing from the file header...
authorPJ Fanning <fanningpj@apache.org>
Tue, 19 Nov 2024 17:39:09 +0000 (17:39 +0000)
committerPJ Fanning <fanningpj@apache.org>
Tue, 19 Nov 2024 17:39:09 +0000 (17:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1921956 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/poifs/storage/HeaderBlock.java
poi/src/test/java/org/apache/poi/poifs/filesystem/TestPOIFSStream.java

index e683fe35a548c58e945aaf417b22154b01b037ce..8b6512d3f2ed549fc013abaf61af5ca660d5204f 100644 (file)
@@ -392,7 +392,7 @@ public final class HeaderBlock implements HeaderBlockConstants {
    public void writeData(final OutputStream stream) throws IOException {
       // Update the counts and start positions 
       new IntegerField(_bat_count_offset,      _bat_count, _data);
-      new IntegerField(_property_count_offset, _property_count, _data);
+      new IntegerField(_property_count_offset, bigBlockSize.getBigBlockSize() == 512 ? 0 : _property_count, _data);
       new IntegerField(_property_start_offset, _property_start, _data);
       new IntegerField(_sbat_start_offset,     _sbat_start, _data);
       new IntegerField(_sbat_block_count_offset, _sbat_count, _data);
index 217eda34d369a3379fed19cf69760530e018ed3d..dcbf5145a0d6d437cf22d7fd5b9960be7d822097 100644 (file)
@@ -2125,7 +2125,7 @@ final class TestPOIFSStream {
                 // Check the header has the right points in it
                 assertEquals(1, header.getBATCount());
                 assertEquals(1, header.getBATArray()[0]);
-                assertEquals(2, header.getPropertyCount());
+                assertEquals(0, header.getPropertyCount());
                 assertEquals(0, header.getPropertyStart());
                 assertEquals(1, header.getSBATCount());
                 assertEquals(21, header.getSBATStart());
@@ -2236,7 +2236,7 @@ final class TestPOIFSStream {
             // Will have fat then properties stream
             assertEquals(1, hdr.getBATCount());
             assertEquals(1, hdr.getBATArray()[0]);
-            assertEquals(1, hdr.getPropertyCount());
+            assertEquals(0, hdr.getPropertyCount());
             assertEquals(0, hdr.getPropertyStart());
             assertEquals(POIFSConstants.END_OF_CHAIN, hdr.getSBATStart());
             assertEquals(POIFSConstants.END_OF_CHAIN, hdr.getXBATIndex());
@@ -2295,7 +2295,7 @@ final class TestPOIFSStream {
                 assertEquals(1, hdr.getBATCount());
                 assertEquals(1, hdr.getBATArray()[0]);
                 assertEquals(2, hdr.getSBATStart());
-                assertEquals(2, hdr.getPropertyCount());
+                assertEquals(0, hdr.getPropertyCount());
                 assertEquals(0, hdr.getPropertyStart());
                 assertEquals(POIFSConstants.END_OF_CHAIN, hdr.getXBATIndex());
 
@@ -2494,6 +2494,38 @@ final class TestPOIFSStream {
         }
     }
 
+    /**
+     * Test that the property count is always 0 when writing files with a block size of 512 bytes.
+     */
+    @Test
+    void testWritePropertyCount512() throws Exception {
+        try (POIFSFileSystem fs = new POIFSFileSystem(_inst.openResourceAsStream("BlockSize512.zvi"))) {
+            assertEquals(0, fs.getHeaderBlock().getPropertyCount(), "Property count");
+
+            for (int i = 1; i <= 100; i++) {
+                fs.getRoot().createOrUpdateDocument("Entry " + i, new ByteArrayInputStream(new byte[8192]));
+            }
+
+            assertEquals(0, writeOutAndReadBack(fs).getHeaderBlock().getPropertyCount(), "Property count");
+        }
+    }
+
+    /**
+     * Test that the property count is updated when writing files with a block size of 4096 bytes.
+     */
+    @Test
+    void testWritePropertyCount4096() throws Exception {
+        try (POIFSFileSystem fs = new POIFSFileSystem(_inst.openResourceAsStream("BlockSize4096.zvi"))) {
+            assertEquals(0, fs.getHeaderBlock().getPropertyCount(), "Property count");
+
+            for (int i = 1; i <= 100; i++) {
+                fs.getRoot().createOrUpdateDocument("Entry " + i, new ByteArrayInputStream(new byte[8192]));
+            }
+
+            assertEquals(5, writeOutAndReadBack(fs).getHeaderBlock().getPropertyCount(), "Property count");
+        }
+    }
+
     /**
      * Test that we can read a file with POIFS, create a new POIFS instance,
      * write it out, read it with POIFS, and see the original data