From a6627b526a362d0aed9a5ea5856dca3b9e3655af Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Wed, 15 Nov 2023 20:06:28 +0100 Subject: writerfilter: fix utext()'s dumb sal_uInt8* parameter This removes all but 4 reinterpret_cast in the module! TableManager::utext() even assumed that the bytes are little-endian. Change-Id: I12031336cabedfd6c0fb614ee0e3400810f98e2d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159486 Tested-by: Jenkins Reviewed-by: Michael Stahl --- writerfilter/inc/dmapper/resourcemodel.hxx | 2 +- writerfilter/source/dmapper/DomainMapper.cxx | 10 ++++---- writerfilter/source/dmapper/DomainMapper.hxx | 2 +- writerfilter/source/dmapper/FontTable.cxx | 2 +- writerfilter/source/dmapper/FontTable.hxx | 2 +- writerfilter/source/dmapper/GraphicImport.cxx | 2 +- writerfilter/source/dmapper/GraphicImport.hxx | 2 +- writerfilter/source/dmapper/LoggedResources.cxx | 4 ++-- writerfilter/source/dmapper/LoggedResources.hxx | 4 ++-- writerfilter/source/dmapper/TableManager.cxx | 4 ++-- writerfilter/source/dmapper/TableManager.hxx | 2 +- .../source/ooxml/OOXMLFastContextHandler.cxx | 28 ++++++++++------------ writerfilter/source/rtftok/rtfdispatchsymbol.cxx | 4 ++-- writerfilter/source/rtftok/rtfdocumentimpl.cxx | 9 ++++--- 14 files changed, 36 insertions(+), 41 deletions(-) (limited to 'writerfilter') diff --git a/writerfilter/inc/dmapper/resourcemodel.hxx b/writerfilter/inc/dmapper/resourcemodel.hxx index e277ed675fc1..695c6c9420d7 100644 --- a/writerfilter/inc/dmapper/resourcemodel.hxx +++ b/writerfilter/inc/dmapper/resourcemodel.hxx @@ -259,7 +259,7 @@ public: @param data buffer containing the text @param len number of characters in the text. */ - virtual void utext(const sal_uInt8* data, size_t len) = 0; + virtual void utext(const sal_Unicode* data, size_t len) = 0; /** * Offset in EMUs for a shape. diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 20462e20e45d..e2ef4ec4a4b2 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2438,7 +2438,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE)); lcl_startCharacterGroup(); sal_Unicode const sBreak[] = { 0x0d }; - lcl_utext(reinterpret_cast(sBreak), 1); + lcl_utext(sBreak, 1); lcl_endCharacterGroup(); lcl_endParagraphGroup(); } @@ -3432,7 +3432,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) rContext->Insert(PROP_CHAR_FONT_NAME_ASIAN, aVal); rContext->Insert(PROP_CHAR_FONT_NAME_COMPLEX, aVal); rContext->Insert(PROP_CHAR_FONT_CHAR_SET, uno::Any(awt::CharSet::SYMBOL)); - utext( reinterpret_cast < const sal_uInt8 * >( &(aSymbolData.cSymbol) ), 1 ); + utext(&(aSymbolData.cSymbol), 1); } } break; @@ -3628,7 +3628,7 @@ void DomainMapper::lcl_endSectionGroup() lcl_startParagraphGroup(); lcl_startCharacterGroup(); sal_Unicode const sBreak[] = { 0x0d }; - lcl_utext(reinterpret_cast(sBreak), 1); + lcl_utext(sBreak, 1); lcl_endCharacterGroup(); lcl_endParagraphGroup(); } @@ -4103,12 +4103,12 @@ void DomainMapper::ResetStyleProperties() } } -void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) +void DomainMapper::lcl_utext(const sal_Unicode *const data_, size_t len) { // All these fixed values are defined as static const sal_Unicode codepoints in the fast parser, // like uFtnEdnRef = 0x2, uFtnEdnSep = 0x3, ... and have a len of 1, if they aren't valid unicode. - OUString sText(reinterpret_cast(data_), len); + OUString const sText(data_, len); const RubyInfo & aInfo = m_pImpl->GetRubyInfo(); if (aInfo.nSprmId == NS_ooxml::LN_CT_Ruby_rt) { diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx index 4fcd55195c84..f9c163ab1f29 100644 --- a/writerfilter/source/dmapper/DomainMapper.hxx +++ b/writerfilter/source/dmapper/DomainMapper.hxx @@ -154,7 +154,7 @@ private: virtual void lcl_startTextBoxContent() override; virtual void lcl_endTextBoxContent() override; virtual void lcl_text(const sal_uInt8 * data, size_t len) override; - virtual void lcl_utext(const sal_uInt8 * data, size_t len) override; + virtual void lcl_utext(const sal_Unicode * data, size_t len) override; virtual void lcl_positionOffset(const OUString& rText, bool bVertical) override; virtual css::awt::Point getPositionOffset() override; virtual void lcl_align(const OUString& rText, bool bVertical) override; diff --git a/writerfilter/source/dmapper/FontTable.cxx b/writerfilter/source/dmapper/FontTable.cxx index 3ddebaedf419..588eb841013c 100644 --- a/writerfilter/source/dmapper/FontTable.cxx +++ b/writerfilter/source/dmapper/FontTable.cxx @@ -189,7 +189,7 @@ void FontTable::lcl_text(const sal_uInt8*, size_t ) { } -void FontTable::lcl_utext(const sal_uInt8* , size_t) +void FontTable::lcl_utext(const sal_Unicode*, size_t) { } diff --git a/writerfilter/source/dmapper/FontTable.hxx b/writerfilter/source/dmapper/FontTable.hxx index a3ec72bb6917..1b6c04c73f54 100644 --- a/writerfilter/source/dmapper/FontTable.hxx +++ b/writerfilter/source/dmapper/FontTable.hxx @@ -72,7 +72,7 @@ class FontTable : public LoggedProperties, public LoggedTable virtual void lcl_startCharacterGroup() override; virtual void lcl_endCharacterGroup() override; virtual void lcl_text(const sal_uInt8 * data, size_t len) override; - virtual void lcl_utext(const sal_uInt8 * data, size_t len) override; + virtual void lcl_utext(const sal_Unicode * data, size_t len) override; virtual void lcl_props(writerfilter::Reference::Pointer_t ref) override; virtual void lcl_table(Id name, writerfilter::Reference::Pointer_t ref) override; diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx index f4825bd6c671..63330c477cbd 100644 --- a/writerfilter/source/dmapper/GraphicImport.cxx +++ b/writerfilter/source/dmapper/GraphicImport.cxx @@ -2010,7 +2010,7 @@ void GraphicImport::lcl_text(const sal_uInt8 * /*_data*/, size_t /*len*/) } -void GraphicImport::lcl_utext(const sal_uInt8 * /*_data*/, size_t /*len*/) +void GraphicImport::lcl_utext(const sal_Unicode * /*_data*/, size_t /*len*/) { } diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx index 9729aecace62..d2462433ade5 100644 --- a/writerfilter/source/dmapper/GraphicImport.hxx +++ b/writerfilter/source/dmapper/GraphicImport.hxx @@ -118,7 +118,7 @@ public: virtual void lcl_startCharacterGroup() override; virtual void lcl_endCharacterGroup() override; virtual void lcl_text(const sal_uInt8 * data, size_t len) override; - virtual void lcl_utext(const sal_uInt8 * data, size_t len) override; + virtual void lcl_utext(const sal_Unicode * data, size_t len) override; virtual void lcl_props(writerfilter::Reference::Pointer_t ref) override; virtual void lcl_table(Id name, writerfilter::Reference
::Pointer_t ref) override; diff --git a/writerfilter/source/dmapper/LoggedResources.cxx b/writerfilter/source/dmapper/LoggedResources.cxx index 819238bf671d..739b2f4dc08d 100644 --- a/writerfilter/source/dmapper/LoggedResources.cxx +++ b/writerfilter/source/dmapper/LoggedResources.cxx @@ -171,13 +171,13 @@ void LoggedStream::text(const sal_uInt8* data, size_t len) #endif } -void LoggedStream::utext(const sal_uInt8* data, size_t len) +void LoggedStream::utext(const sal_Unicode* const data, size_t const len) { #ifdef DBG_UTIL mHelper.startElement("utext"); mHelper.startElement("data"); - OUString sText(reinterpret_cast(data), len); + OUString const sText(data, len); LoggedResourcesHelper::chars(sText); diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx index d40ca89ae68b..b5c5c0bd04d3 100644 --- a/writerfilter/source/dmapper/LoggedResources.hxx +++ b/writerfilter/source/dmapper/LoggedResources.hxx @@ -63,7 +63,7 @@ public: void startTextBoxContent() override; void endTextBoxContent() override; void text(const sal_uInt8* data, size_t len) override; - void utext(const sal_uInt8* data, size_t len) override; + void utext(const sal_Unicode* data, size_t len) override; void positionOffset(const OUString& rText, bool bVertical) override; void align(const OUString& rText, bool bVertical) override; void positivePercentage(const OUString& rText) override; @@ -89,7 +89,7 @@ protected: virtual void lcl_startTextBoxContent() = 0; virtual void lcl_endTextBoxContent() = 0; virtual void lcl_text(const sal_uInt8* data, size_t len) = 0; - virtual void lcl_utext(const sal_uInt8* data, size_t len) = 0; + virtual void lcl_utext(const sal_Unicode* data, size_t len) = 0; virtual void lcl_positionOffset(const OUString& /*rText*/, bool /*bVertical*/) {} virtual css::awt::Point getPositionOffset() override { return css::awt::Point(); } virtual void lcl_align(const OUString& /*rText*/, bool /*bVertical*/) {} diff --git a/writerfilter/source/dmapper/TableManager.cxx b/writerfilter/source/dmapper/TableManager.cxx index 5554a93d9fcf..6a0c70a39f52 100644 --- a/writerfilter/source/dmapper/TableManager.cxx +++ b/writerfilter/source/dmapper/TableManager.cxx @@ -215,13 +215,13 @@ void TableManager::tableExceptionProps(const TablePropertyMapPtr& pProps) #endif } -void TableManager::utext(const sal_uInt8* data, std::size_t len) +void TableManager::utext(const sal_Unicode* const data, std::size_t const len) { // optimization: cell/row end characters are the last characters in a run if (len > 0) { - sal_Unicode nChar = data[(len - 1) * 2] + (data[(len - 1) * 2 + 1] << 8); + sal_Unicode const nChar = data[len - 1]; if (nChar == 0x7) handle0x7(); } diff --git a/writerfilter/source/dmapper/TableManager.hxx b/writerfilter/source/dmapper/TableManager.hxx index f23b371f4a94..0707e04d5ec3 100644 --- a/writerfilter/source/dmapper/TableManager.hxx +++ b/writerfilter/source/dmapper/TableManager.hxx @@ -466,7 +466,7 @@ public: @param data array of characters @param len number of characters to handle */ - void utext(const sal_uInt8 * data, size_t len); + void utext(const sal_Unicode * data, size_t len); /** Handle properties of the current cell. diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index 6cc1da731432..30ed3a70e63c 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -385,7 +385,7 @@ void OOXMLFastContextHandler::startCharacterGroup() mpParserState->resolveCharacterProperties(*mpStream); if (mpParserState->isStartFootnote()) { - mpStream->utext(reinterpret_cast(&uFtnSep), 1); + mpStream->utext(&uFtnSep, 1); mpParserState->setStartFootnote(false); } } @@ -583,13 +583,13 @@ void OOXMLFastContextHandler::lockField() void OOXMLFastContextHandler::ftnednref() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uFtnEdnRef), 1); + mpStream->utext(&uFtnEdnRef, 1); } void OOXMLFastContextHandler::ftnednsep() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uFtnEdnSep), 1); + mpStream->utext(&uFtnEdnSep, 1); } void OOXMLFastContextHandler::ftnedncont() @@ -601,13 +601,13 @@ void OOXMLFastContextHandler::ftnedncont() void OOXMLFastContextHandler::pgNum() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uPgNum), 1); + mpStream->utext(&uPgNum, 1); } void OOXMLFastContextHandler::tab() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uTab), 1); + mpStream->utext(&uTab, 1); } void OOXMLFastContextHandler::symbol() @@ -619,19 +619,19 @@ void OOXMLFastContextHandler::symbol() void OOXMLFastContextHandler::cr() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uCR), 1); + mpStream->utext(&uCR, 1); } void OOXMLFastContextHandler::noBreakHyphen() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uNoBreakHyphen), 1); + mpStream->utext(&uNoBreakHyphen, 1); } void OOXMLFastContextHandler::softHyphen() { if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uSoftHyphen), 1); + mpStream->utext(&uSoftHyphen, 1); } void OOXMLFastContextHandler::handleLastParagraphInSection() @@ -648,7 +648,7 @@ void OOXMLFastContextHandler::endOfParagraph() if (! mpParserState->isInCharacterGroup()) startCharacterGroup(); if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uCR), 1); + mpStream->utext(&uCR, 1); mpParserState->getDocument()->incrementProgress(); } @@ -713,9 +713,7 @@ void OOXMLFastContextHandler::text(const OUString & sText) { sNormalizedText = TrimXMLWhitespace(sNormalizedText).replaceAll("\t", " "); } - mpStream->utext(reinterpret_cast < const sal_uInt8 * > - (sNormalizedText.getStr()), - sNormalizedText.getLength()); + mpStream->utext(sNormalizedText.getStr(), sNormalizedText.getLength()); } void OOXMLFastContextHandler::positionOffset(const OUString& rText) @@ -997,9 +995,7 @@ void OOXMLFastContextHandlerStream::sendProperty(Id nId) OOXMLPropertySetEntryToString aHandler(nId); getPropertySetAttrs()->resolve(aHandler); const OUString & sText = aHandler.getString(); - mpStream->utext(reinterpret_cast < const sal_uInt8 * > - (sText.getStr()), - sText.getLength()); + mpStream->utext(sText.getStr(), sText.getLength()); } @@ -1529,7 +1525,7 @@ void OOXMLFastContextHandlerTextTableRow::endRow() startCharacterGroup(); if (isForwardEvents()) - mpStream->utext(reinterpret_cast(&uCR), 1); + mpStream->utext(&uCR, 1); endCharacterGroup(); endParagraphGroup(); diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx index 23a97fc68524..d5b196790a50 100644 --- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx +++ b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx @@ -404,7 +404,7 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) checkNeedPap(); // flush previously deferred break - needed for testFdo49893_2 // which has consecutive \page with no text between - sal_uInt8 const nothing[] = { 0 /*MSVC doesn't allow it to be empty*/ }; + sal_Unicode const nothing[] = { 0 /*MSVC doesn't allow it to be empty*/ }; Mapper().utext(nothing, 0); } sal_uInt8 const sBreak[] = { 0xc }; @@ -427,7 +427,7 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) case RTFKeyword::CHFTNSEP: { static const sal_Unicode uFtnEdnSep = 0x3; - Mapper().utext(reinterpret_cast(&uFtnEdnSep), 1); + Mapper().utext(&uFtnEdnSep, 1); } break; default: diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 958000e4587a..4bc611992c88 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -648,7 +648,7 @@ void RTFDocumentImpl::runProps() void RTFDocumentImpl::runBreak() { sal_Unicode const sBreak[] = { 0x0d }; - Mapper().utext(reinterpret_cast(sBreak), 1); + Mapper().utext(sBreak, 1); m_bNeedCr = false; } @@ -1616,7 +1616,7 @@ void RTFDocumentImpl::text(OUString& rString) runProps(); if (!pCurrentBuffer) - Mapper().utext(reinterpret_cast(rString.getStr()), rString.getLength()); + Mapper().utext(rString.getStr(), rString.getLength()); else { auto pValue = new RTFValue(rString); @@ -1765,8 +1765,7 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* const pSprms, else if (std::get<0>(aTuple) == BUFFER_UTEXT) { OUString const aString(std::get<1>(aTuple)->getString()); - Mapper().utext(reinterpret_cast(aString.getStr()), - aString.getLength()); + Mapper().utext(aString.getStr(), aString.getLength()); } else if (std::get<0>(aTuple) == BUFFER_ENDRUN) Mapper().endCharacterGroup(); @@ -2572,7 +2571,7 @@ RTFError RTFDocumentImpl::beforePopState(RTFParserState& rState) : std::u16string_view(u"TC")); str = OUString::Concat(field) + " \"" + str.replaceAll("\"", "\\\"") + "\""; singleChar(cFieldStart); - Mapper().utext(reinterpret_cast(str.getStr()), str.getLength()); + Mapper().utext(str.getStr(), str.getLength()); singleChar(cFieldSep); // no result singleChar(cFieldEnd); -- cgit