From ac64868d4c31de5c31211ab919a1f7da9576c5f2 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 20 Jun 2022 18:06:19 +0300 Subject: [PATCH] fix vba read and other --- ASCOfficeDocxFile2/BinReader/Readers.cpp | 6 +++-- ASCOfficeXlsFile2/source/VbaFormat/Records.h | 2 +- .../source/VbaFormat/VbaBinary.cpp | 22 ++++++++++++------- .../source/VbaFormat/VbaReader.cpp | 8 ++++++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ASCOfficeDocxFile2/BinReader/Readers.cpp b/ASCOfficeDocxFile2/BinReader/Readers.cpp index c01c7d06ae..d4d6ed9f82 100644 --- a/ASCOfficeDocxFile2/BinReader/Readers.cpp +++ b/ASCOfficeDocxFile2/BinReader/Readers.cpp @@ -591,8 +591,10 @@ int Binary_rPrReader::ReadContent(BYTE type, long length, void* poResult) }break; case c_oSerProp_rPrType::HighLightTyped: { + BYTE byteHighLightTyped = m_oBufferedStream.GetUChar(); + pRPr->m_oHighlight.Init(); pRPr->m_oHighlight->m_oVal.Init(); - pRPr->m_oHighlight->m_oVal->SetValueFromByte(m_oBufferedStream.GetUChar()); + pRPr->m_oHighlight->m_oVal->SetValue(SimpleTypes::highlightcolorNone); }break; case c_oSerProp_rPrType::Shd: { @@ -9309,7 +9311,7 @@ int Binary_DocumentTableReader::ReadSdtPr(BYTE type, long length, void* poResult else if (c_oSerSdt::RPr == type) { pSdtWraper->m_oRPr.Init(); - res = oBinary_rPrReader.Read(length, &pSdtWraper->m_oRPr); + res = oBinary_rPrReader.Read(length, pSdtWraper->m_oRPr.GetPointer()); } else if (c_oSerSdt::ShowingPlcHdr == type) { diff --git a/ASCOfficeXlsFile2/source/VbaFormat/Records.h b/ASCOfficeXlsFile2/source/VbaFormat/Records.h index 4e846e0bb1..9451d1018a 100644 --- a/ASCOfficeXlsFile2/source/VbaFormat/Records.h +++ b/ASCOfficeXlsFile2/source/VbaFormat/Records.h @@ -435,7 +435,7 @@ namespace VBA virtual void load(CVbaFileStreamPtr stream); - _UINT32 TextOffset; + _UINT32 TextOffset = 0xffffffff; }; typedef boost::shared_ptr MODULEOFFSETPtr; //----------------------------------------------------------------------------- diff --git a/ASCOfficeXlsFile2/source/VbaFormat/VbaBinary.cpp b/ASCOfficeXlsFile2/source/VbaFormat/VbaBinary.cpp index 456a693f48..118bf225da 100644 --- a/ASCOfficeXlsFile2/source/VbaFormat/VbaBinary.cpp +++ b/ASCOfficeXlsFile2/source/VbaFormat/VbaBinary.cpp @@ -132,6 +132,11 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset) return; } dataSize -= 1; + + if (offset > dataSize) + { + return; //error; + } stream->seek(stream->tell() + offset); dataSize -= offset; @@ -140,23 +145,24 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset) stream->read(data, dataSize); unsigned char *dataCur = data; - size_t dataPos = 0; - while (dataPos + 2 < dataSize) + while (dataCur - data < dataSize - 2) { std::vector arrChunk; _UINT16 header = *((_UINT32*)dataCur); dataCur += 2; bool bCompressed = ((header & CHUNK_COMPRESSED) != 0); - _UINT16 chunkSize = (header & CHUNK_LENMASK); + _UINT16 chunkSize = (header & CHUNK_LENMASK) + 1; + bool bUnknown = false; if ((header & CHUNK_SIGMASK) != CHUNK_SIG) { bCompressed = true; chunkSize = 4094; //по факту + bUnknown = true; } - POLE::uint64 target = (dataCur - data) + chunkSize; - + unsigned char *dataNext = dataCur + chunkSize; + if (bCompressed) { unsigned char nBitCount = 4; @@ -203,8 +209,7 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset) } else { - arrChunk.emplace_back(); - arrChunk.back() = *dataCur; dataCur++; + arrChunk.push_back(*dataCur); dataCur++; ++chunkPos; } } @@ -215,7 +220,8 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset) arrChunk.resize(chunkSize); memcpy(arrChunk.data(), dataCur, chunkSize); dataCur += chunkSize; } - dataPos = target; + + dataCur = dataNext; arrChunks.insert(arrChunks.end(), arrChunk.begin(), arrChunk.end()); } } diff --git a/ASCOfficeXlsFile2/source/VbaFormat/VbaReader.cpp b/ASCOfficeXlsFile2/source/VbaFormat/VbaReader.cpp index 25c9c6219b..6edb8c786f 100644 --- a/ASCOfficeXlsFile2/source/VbaFormat/VbaReader.cpp +++ b/ASCOfficeXlsFile2/source/VbaFormat/VbaReader.cpp @@ -103,6 +103,9 @@ const std::wstring CVbaReader::convert() { for (size_t i = 0; i < DirStreamObject->ModulesRecord->modules.size(); ++i) { + if (!DirStreamObject->ModulesRecord->modules[i]) + continue; + CP_XML_NODE(L"Module") { if (DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord) @@ -121,7 +124,10 @@ const std::wstring CVbaReader::convert() DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord->StreamNameUnicode.value); _UINT32 offset = DirStreamObject->ModulesRecord->modules[i]->OffsetRecord ? - DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0;//skip cache + DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0xffffffff;//skip cache + + if (offset == 0xffffffff) + continue; // error record CVbaFileStreamPtr strmModule = vbaProject_file_->getNamedStream(streamName, offset); strmModule->CodePage = code_page_;