diff options
author | James Ahlborn <jtahlborn@yahoo.com> | 2013-09-14 13:20:39 +0000 |
---|---|---|
committer | James Ahlborn <jtahlborn@yahoo.com> | 2013-09-14 13:20:39 +0000 |
commit | 012c3e7c30a0e09f788e8b43374549c07657ca5d (patch) | |
tree | 01b278dfba509888113a3e60d133549315cb47a8 | |
parent | e7409f5aa21e2b845623579db69b0db620113f2c (diff) | |
download | jackcess-012c3e7c30a0e09f788e8b43374549c07657ca5d.tar.gz jackcess-012c3e7c30a0e09f788e8b43374549c07657ca5d.zip |
Ignore invalid column usage map definitions, fixes issue 97
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@800 f203690c-595d-4dc9-a70b-905162fa7fd2
-rw-r--r-- | src/changes/changes.xml | 8 | ||||
-rw-r--r-- | src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java | 21 | ||||
-rw-r--r-- | src/main/java/com/healthmarketscience/jackcess/impl/UsageMap.java | 5 |
3 files changed, 28 insertions, 6 deletions
diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a4a33f4..94a241d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -8,6 +8,9 @@ <action dev="jahlborn" type="add"> Add initial support for creating/parsing ole content. </action> + <action dev="jahlborn" type="fix" system="SourceForge2" issue="97"> + Ignore invalid column usage map definitions. + </action> </release> <release version="2.0.0" date="2013-08-26"> <action dev="jahlborn" type="update"> @@ -16,6 +19,11 @@ for more details. </action> </release> + <release version="1.2.14.3" date="TBD"> + <action dev="jahlborn" type="fix" system="SourceForge2" issue="97"> + Ignore invalid column usage map definitions. + </action> + </release> <release version="1.2.14.2" date="2013-08-25"> <action dev="jahlborn" type="fix" system="SourceForge2" issue="96"> Fix reading of Properties with multiple value blocks. diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java b/src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java index 4cd3365..240ebf6 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java @@ -48,7 +48,6 @@ import com.healthmarketscience.jackcess.Column; import com.healthmarketscience.jackcess.ColumnBuilder; import com.healthmarketscience.jackcess.CursorBuilder; import com.healthmarketscience.jackcess.DataType; -import com.healthmarketscience.jackcess.Index; import com.healthmarketscience.jackcess.IndexBuilder; import com.healthmarketscience.jackcess.PropertyMap; import com.healthmarketscience.jackcess.Row; @@ -270,11 +269,21 @@ public class TableImpl implements Table break; } - UsageMap colOwnedPages = UsageMap.read( - getDatabase(), tableBuffer, false); - UsageMap colFreeSpacePages = UsageMap.read( - getDatabase(), tableBuffer, false); - + int pos = tableBuffer.position(); + UsageMap colOwnedPages = null; + UsageMap colFreeSpacePages = null; + try { + colOwnedPages = UsageMap.read(getDatabase(), tableBuffer, false); + colFreeSpacePages = UsageMap.read(getDatabase(), tableBuffer, false); + } catch(IllegalStateException e) { + // ignore invalid usage map info + colOwnedPages = null; + colFreeSpacePages = null; + tableBuffer.position(pos + 8); + LOG.warn("Table " + _name + " invalid column " + umapColNum + + " usage map definition: " + e); + } + for(ColumnImpl col : _columns) { if(col.getColumnNumber() == umapColNum) { col.setUsageMaps(colOwnedPages, colFreeSpacePages); diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/UsageMap.java b/src/main/java/com/healthmarketscience/jackcess/impl/UsageMap.java index 9169582..ac49c44 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/UsageMap.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/UsageMap.java @@ -134,6 +134,11 @@ public class UsageMap int rowNum, boolean assumeOutOfRangeBitsOn) throws IOException { + if(pageNum <= 0) { + // usage maps will never appear on page 0 (or less) + throw new IllegalStateException("Invalid usage map page number " + pageNum); + } + JetFormat format = database.getFormat(); PageChannel pageChannel = database.getPageChannel(); ByteBuffer tableBuffer = pageChannel.createPageBuffer(); |