]> source.dussan.org Git - poi.git/commitdiff
Bug 58069 - Biff8RC4 xorShort returns wrong value for unsigned shorts
authorAndreas Beeker <kiwiwings@apache.org>
Tue, 23 Jun 2015 23:06:23 +0000 (23:06 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Tue, 23 Jun 2015 23:06:23 +0000 (23:06 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1687146 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/crypto/Biff8DecryptingStream.java
src/testcases/org/apache/poi/hssf/record/crypto/TestBiff8DecryptingStream.java

index f52a15d814121baca970e3a57ea5e09827b6452f..564174b609e71c5a6c9e200cf073b642d91b6216 100644 (file)
@@ -95,7 +95,7 @@ public final class Biff8DecryptingStream implements BiffHeaderInput, LittleEndia
 
 
        public int readUByte() {
-               return _cipher.xorByte(_le.readUByte());
+               return readByte() & 0xFF;
        }
        public byte readByte() {
                return (byte) _cipher.xorByte(_le.readUByte());
@@ -103,7 +103,7 @@ public final class Biff8DecryptingStream implements BiffHeaderInput, LittleEndia
 
 
        public int readUShort() {
-               return _cipher.xorShort(_le.readUShort());
+               return readShort() & 0xFFFF;
        }
        public short readShort() {
                return (short) _cipher.xorShort(_le.readUShort());
index 9d9c04417fd810680b303383acc553d8673d733e..6c8cd01779350867bdd576401a2dccbc1a18b3e4 100644 (file)
@@ -96,9 +96,21 @@ public final class TestBiff8DecryptingStream {
                }
 
                public void confirmShort(int expVal) {
-                       cmp(HexDump.shortToHex(expVal), HexDump.shortToHex(_bds.readUShort()));
+                       cmp(HexDump.shortToHex(expVal), HexDump.shortToHex(_bds.readShort()));
                }
 
+        public void confirmUShort(int expVal) {
+            cmp(HexDump.shortToHex(expVal), HexDump.shortToHex(_bds.readUShort()));
+        }
+        
+        public short readShort() {
+            return _bds.readShort();
+        }
+
+        public int readUShort() {
+            return _bds.readUShort();
+        }
+
                public void confirmInt(int expVal) {
                        cmp(HexDump.intToHex(expVal), HexDump.intToHex(_bds.readInt()));
                }
@@ -106,7 +118,7 @@ public final class TestBiff8DecryptingStream {
                public void confirmLong(long expVal) {
                        cmp(HexDump.longToHex(expVal), HexDump.longToHex(_bds.readLong()));
                }
-
+               
                private void cmp(char[] exp, char[] act) {
                        if (Arrays.equals(exp, act)) {
                                return;
@@ -166,6 +178,15 @@ public final class TestBiff8DecryptingStream {
                st.rollForward(0x0C04, 0x0FF8);
                st.confirmLong(0x6AA2D5F6B975D10CL);
                st.confirmLong(0x34248ADF7ED4F029L);
+               // check for signed/unsigned shorts #58069
+               st.rollForward(0x1008, 0x7213);
+               st.confirmUShort(0xFFFF);
+               st.rollForward(0x7215, 0x1B9AD);
+        st.confirmShort(-1);
+        st.rollForward(0x1B9AF, 0x37D99);
+        assertEquals(0xFFFF, st.readUShort());
+        st.rollForward(0x37D9B, 0x4A6F2);
+        assertEquals(-1, st.readShort());
                st.assertNoErrors();
        }
 
@@ -229,7 +250,7 @@ public final class TestBiff8DecryptingStream {
                st.confirmData("01 C2 4E 55");  // first 4 bytes in next block
                st.assertNoErrors();
        }
-    
+
        private static StreamTester createStreamTester(int mockStreamStartVal, String keyDigestHex, int expectedFirstInt) {
                return new StreamTester(new MockStream(mockStreamStartVal), keyDigestHex, expectedFirstInt);
        }