diff options
author | Avik Sengupta <avik@apache.org> | 2005-05-25 15:37:21 +0000 |
---|---|---|
committer | Avik Sengupta <avik@apache.org> | 2005-05-25 15:37:21 +0000 |
commit | 865c8bb4c4e2dfdc2fff995d3b8882c1c8786a19 (patch) | |
tree | 641c8b23ef0cbff0225e2994d36a5c5c0a13e4bd /src/java/org/apache/poi/ddf | |
parent | 0ee73b1c5e3208b0ff0ead6a7b295099740715d6 (diff) | |
download | poi-865c8bb4c4e2dfdc2fff995d3b8882c1c8786a19.tar.gz poi-865c8bb4c4e2dfdc2fff995d3b8882c1c8786a19.zip |
check for short EscherClientAnchor Records. Bug 34787 : by Nick Burch
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353700 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/poi/ddf')
-rw-r--r-- | src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java index d8bb4acfc1..9f8fb4c177 100644 --- a/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java +++ b/src/java/org/apache/poi/ddf/EscherClientAnchorRecord.java @@ -47,6 +47,7 @@ public class EscherClientAnchorRecord private short field_8_row2; private short field_9_dy2; private byte[] remainingData; + private boolean shortRecord = false; /** * This method deserializes the record from a byte array. @@ -61,15 +62,22 @@ public class EscherClientAnchorRecord int bytesRemaining = readHeader( data, offset ); int pos = offset + 8; int size = 0; + + // Always find 4 two byte entries. Sometimes find 9 field_1_flag = LittleEndian.getShort( data, pos + size ); size += 2; field_2_col1 = LittleEndian.getShort( data, pos + size ); size += 2; field_3_dx1 = LittleEndian.getShort( data, pos + size ); size += 2; field_4_row1 = LittleEndian.getShort( data, pos + size ); size += 2; - field_5_dy1 = LittleEndian.getShort( data, pos + size ); size += 2; - field_6_col2 = LittleEndian.getShort( data, pos + size ); size += 2; - field_7_dx2 = LittleEndian.getShort( data, pos + size ); size += 2; - field_8_row2 = LittleEndian.getShort( data, pos + size ); size += 2; - field_9_dy2 = LittleEndian.getShort( data, pos + size ); size += 2; + if(bytesRemaining >= 18) { + field_5_dy1 = LittleEndian.getShort( data, pos + size ); size += 2; + field_6_col2 = LittleEndian.getShort( data, pos + size ); size += 2; + field_7_dx2 = LittleEndian.getShort( data, pos + size ); size += 2; + field_8_row2 = LittleEndian.getShort( data, pos + size ); size += 2; + field_9_dy2 = LittleEndian.getShort( data, pos + size ); size += 2; + shortRecord = false; + } else { + shortRecord = true; + } bytesRemaining -= size; remainingData = new byte[bytesRemaining]; System.arraycopy( data, pos + size, remainingData, 0, bytesRemaining ); @@ -92,19 +100,21 @@ public class EscherClientAnchorRecord if (remainingData == null) remainingData = new byte[0]; LittleEndian.putShort( data, offset, getOptions() ); LittleEndian.putShort( data, offset + 2, getRecordId() ); - int remainingBytes = remainingData.length + 18; + int remainingBytes = remainingData.length + (shortRecord ? 8 : 18); LittleEndian.putInt( data, offset + 4, remainingBytes ); LittleEndian.putShort( data, offset + 8, field_1_flag ); LittleEndian.putShort( data, offset + 10, field_2_col1 ); LittleEndian.putShort( data, offset + 12, field_3_dx1 ); LittleEndian.putShort( data, offset + 14, field_4_row1 ); - LittleEndian.putShort( data, offset + 16, field_5_dy1 ); - LittleEndian.putShort( data, offset + 18, field_6_col2 ); - LittleEndian.putShort( data, offset + 20, field_7_dx2 ); - LittleEndian.putShort( data, offset + 22, field_8_row2 ); - LittleEndian.putShort( data, offset + 24, field_9_dy2 ); - System.arraycopy( remainingData, 0, data, offset + 26, remainingData.length ); - int pos = offset + 8 + 18 + remainingData.length; + if(!shortRecord) { + LittleEndian.putShort( data, offset + 16, field_5_dy1 ); + LittleEndian.putShort( data, offset + 18, field_6_col2 ); + LittleEndian.putShort( data, offset + 20, field_7_dx2 ); + LittleEndian.putShort( data, offset + 22, field_8_row2 ); + LittleEndian.putShort( data, offset + 24, field_9_dy2 ); + } + System.arraycopy( remainingData, 0, data, offset + (shortRecord ? 16 : 26), remainingData.length ); + int pos = offset + 8 + (shortRecord ? 8 : 18) + remainingData.length; listener.afterRecordSerialize( pos, getRecordId(), pos - offset, this ); return pos - offset; @@ -117,7 +127,7 @@ public class EscherClientAnchorRecord */ public int getRecordSize() { - return 8 + 18 + (remainingData == null ? 0 : remainingData.length); + return 8 + (shortRecord ? 8 : 18) + (remainingData == null ? 0 : remainingData.length); } /** @@ -249,6 +259,7 @@ public class EscherClientAnchorRecord */ public void setDy1( short field_5_dy1 ) { + shortRecord = false; this.field_5_dy1 = field_5_dy1; } @@ -265,6 +276,7 @@ public class EscherClientAnchorRecord */ public void setCol2( short field_6_col2 ) { + shortRecord = false; this.field_6_col2 = field_6_col2; } @@ -281,6 +293,7 @@ public class EscherClientAnchorRecord */ public void setDx2( short field_7_dx2 ) { + shortRecord = false; this.field_7_dx2 = field_7_dx2; } @@ -297,6 +310,7 @@ public class EscherClientAnchorRecord */ public void setRow2( short field_8_row2 ) { + shortRecord = false; this.field_8_row2 = field_8_row2; } @@ -313,6 +327,7 @@ public class EscherClientAnchorRecord */ public void setDy2( short field_9_dy2 ) { + shortRecord = false; this.field_9_dy2 = field_9_dy2; } |