[Libreoffice-commits] mso-dumper.git: 2 commits - src/docdirstream.py src/docrecord.py

Miklos Vajna vmiklos at kemper.freedesktop.org
Fri May 24 09:00:38 PDT 2013


 src/docdirstream.py |    3 +++
 src/docrecord.py    |    5 +++--
 2 files changed, 6 insertions(+), 2 deletions(-)

New commits:
commit 7918464989883ee64b7dd0bb5b602b6b791e100d
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Fri May 24 17:37:17 2013 +0200

    Selsf: check for the size from the spec
    
    E.g. fdo45983-1.doc has some additional bytes after the documented struct.

diff --git a/src/docrecord.py b/src/docrecord.py
index 0563cb2..c2a73d0 100644
--- a/src/docrecord.py
+++ b/src/docrecord.py
@@ -337,6 +337,7 @@ class Sty(DOCDirStream):
         self.parent.pos = self.pos
 
 class Selsf(DOCDirStream):
+    size = 36 # defined by 2.9.241
     """The Selsf structure specifies the last selection that was made to the document."""
     def __init__(self, mainStream):
         DOCDirStream.__init__(self, mainStream.getTableStream().bytes)
@@ -380,7 +381,7 @@ class Selsf(DOCDirStream):
         self.printAndSet("cpAnchorShrink", self.readuInt32())
         self.printAndSet("xaTableLeft", self.readInt16())
         self.printAndSet("xaTableRight", self.readInt16())
-        assert self.pos == self.mainStream.fcWss + self.size
+        assert self.pos == self.mainStream.fcWss + Selsf.size
         print '</selsf>'
 
 class BRC(DOCDirStream):
commit aad5403441fed65a8fecefc10d147a066c0a521f
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Fri May 24 17:06:22 2013 +0200

    Sprm: don't read 4 bytes when operand size is 3
    
    Triggered by fdo45100-1.doc

diff --git a/src/docdirstream.py b/src/docdirstream.py
index 4e29943..c3e4207 100644
--- a/src/docdirstream.py
+++ b/src/docdirstream.py
@@ -78,6 +78,9 @@ class DOCDirStream:
         self.pos += 2
         return ret
 
+    def getuInt24(self):
+        return struct.unpack("<I", self.bytes[self.pos:self.pos+3] + "\x00")[0]
+
     def getuInt32(self, bytes = None, pos = None):
         if not bytes:
             bytes = self.bytes
diff --git a/src/docrecord.py b/src/docrecord.py
index 8d90b51..0563cb2 100644
--- a/src/docrecord.py
+++ b/src/docrecord.py
@@ -732,7 +732,7 @@ class Sprm(DOCDirStream):
         elif self.getOperandSize() == 2:
             self.operand = self.getuInt16()
         elif self.getOperandSize() == 3:
-            self.operand = self.getuInt32() & 0x0fff
+            self.operand = self.getuInt24()
         elif self.getOperandSize() == 4:
             self.operand = self.getuInt32()
         elif self.getOperandSize() == 7:


More information about the Libreoffice-commits mailing list