]> source.dussan.org Git - poi.git/commitdiff
Bit more on NPOIFSFileSystem, and some typo fixes in documentation
authorNick Burch <nick@apache.org>
Sun, 19 Dec 2010 11:43:54 +0000 (11:43 +0000)
committerNick Burch <nick@apache.org>
Sun, 19 Dec 2010 11:43:54 +0000 (11:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1050815 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/filesystem/NPOIFSFileSystem.java
src/java/org/apache/poi/poifs/property/PropertyFactory.java
src/java/org/apache/poi/poifs/property/PropertyTable.java

index d859139d3cdffc894abdd71f348a5d315a401666..c03a66792e30d6c29b2ad0258d2940bb30c62643 100644 (file)
@@ -266,17 +266,22 @@ public class NPOIFSFileSystem
        // Grab the block size
        bigBlockSize = _header.getBigBlockSize();
        
+       // Each block should only ever be used by one of the
+       //  FAT, XFAT or Property Table. Ensure it does
+       ChainLoopDetector loopDetector = new ChainLoopDetector();
+       
        // Read the FAT blocks
-       for(int fatAT : _header.getBATArray()) {
-          ByteBuffer fatData = getBlockAt(fatAT);
+       for(int fatAt : _header.getBATArray()) {
+          loopDetector.claim(fatAt);
+          ByteBuffer fatData = getBlockAt(fatAt);
           _blocks.add(BATBlock.createBATBlock(bigBlockSize, fatData));
        }
        
        // Now read the XFAT blocks
-// TODO Corrupt / Loop checking       
        BATBlock xfat; 
        int nextAt = _header.getXBATIndex();
        for(int i=0; i<_header.getXBATCount(); i++) {
+          loopDetector.claim(nextAt);
           ByteBuffer fatData = getBlockAt(nextAt);
           xfat = BATBlock.createBATBlock(bigBlockSize, fatData);
           nextAt = xfat.getValueAt(bigBlockSize.getNextXBATChainOffset());
@@ -287,7 +292,6 @@ public class NPOIFSFileSystem
        // We're now able to load steams
        // Use this to read in the properties
        // TODO
-// TODO With loop checking
     }
     
     /**
@@ -614,6 +618,27 @@ public class NPOIFSFileSystem
             }
         }
     }
+    
+    /**
+     * Used to detect if a chain has a loop in it, so
+     *  we can bail out with an error rather than
+     *  spinning away for ever... 
+     */
+    private class ChainLoopDetector {
+       private boolean[] used_blocks;
+       private ChainLoopDetector() throws IOException {
+          used_blocks = new boolean[(int)(_data.size()/bigBlockSize.getBigBlockSize())];
+       }
+       private void claim(int offset) {
+          if(used_blocks[offset]) {
+             throw new IllegalStateException(
+                   "Potential loop detected - Block " + offset + 
+                   " was already claimed but was just requested again"
+             );
+          }
+          used_blocks[offset] = true;
+       }
+    }
 
     /* ********** START begin implementation of POIFSViewable ********** */
 
index a4036f9d003f824028a6183a52e7cf3166c46e94..7dc92df2e6080ddf509f00945536d60db324f460 100644 (file)
@@ -28,7 +28,7 @@ import org.apache.poi.poifs.storage.ListManagedBlock;
 
 /**
  * Factory for turning an array of RawDataBlock instances containing
- * Proprty data into an array of proper Property objects.
+ * Property data into an array of proper Property objects.
  *
  * The array produced may be sparse, in that any portion of data that
  * should correspond to a Property, but which does not map to a proper
index 3fe40d5280da6091d7e6f459c0315d980cbe7b6d..cce2a5a16e96157f9bd0cbe5c3f3ef2e0eace603 100644 (file)
@@ -32,7 +32,7 @@ import org.apache.poi.poifs.storage.RawDataBlockList;
 
 /**
  * This class embodies the Property Table for the filesystem; this is
- * basically the dsirectory for all of the documents in the
+ * basically the directory for all of the documents in the
  * filesystem.
  *
  * @author Marc Johnson (mjohnson at apache dot org)