From fdf7d4092a5fa9c79bbb4a626a4d3d087053ae2c Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Tue, 18 Apr 2017 15:25:58 -0400 Subject: Remove IFGAS_Stream::CreateWideStringReadStream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This Cl removes the wide string read stream and passes through a memory stream as needed. The callers were updated to pass the correct types. Change-Id: I8e2660859a85e38ed1c3f4c596ef7c8242762084 Reviewed-on: https://pdfium-review.googlesource.com/4172 Commit-Queue: dsinclair Reviewed-by: Tom Sepez Reviewed-by: Nicolás Peña --- testing/libfuzzer/pdf_xml_fuzzer.cc | 6 +-- xfa/fgas/crt/ifgas_stream.cpp | 71 ---------------------------------- xfa/fgas/crt/ifgas_stream.h | 2 - xfa/fxfa/parser/cxfa_node.cpp | 18 ++++----- xfa/fxfa/parser/cxfa_simple_parser.cpp | 20 ++++------ xfa/fxfa/parser/cxfa_simple_parser.h | 4 +- 6 files changed, 17 insertions(+), 104 deletions(-) diff --git a/testing/libfuzzer/pdf_xml_fuzzer.cc b/testing/libfuzzer/pdf_xml_fuzzer.cc index 8284bc6ce7..1f368699f4 100644 --- a/testing/libfuzzer/pdf_xml_fuzzer.cc +++ b/testing/libfuzzer/pdf_xml_fuzzer.cc @@ -51,10 +51,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { if (!safe_size.IsValid()) return 0; - CFX_WideString input = - CFX_WideString::FromUTF8(CFX_ByteStringC(data, safe_size.ValueOrDie())); - CFX_RetainPtr stream = - IFGAS_Stream::CreateWideStringReadStream(input); + CFX_RetainPtr stream = IFGAS_Stream::CreateReadStream( + IFX_MemoryStream::Create(const_cast(data), size)); if (!stream) return 0; diff --git a/xfa/fgas/crt/ifgas_stream.cpp b/xfa/fgas/crt/ifgas_stream.cpp index 06ab46551d..7a90626fe8 100644 --- a/xfa/fgas/crt/ifgas_stream.cpp +++ b/xfa/fgas/crt/ifgas_stream.cpp @@ -56,36 +56,6 @@ class CFGAS_Stream : public IFGAS_Stream { CFX_RetainPtr m_pStream; }; -class CFGAS_WideStringReadStream : public IFGAS_Stream { - public: - template - friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); - - // IFGAS_Stream - FX_FILESIZE GetLength() const override { - return m_wsBuffer.GetLength() * sizeof(wchar_t); - } - FX_FILESIZE GetPosition() override { return m_iPosition * sizeof(wchar_t); } - FX_STRSIZE GetBOMLength() const override { return 0; } - void Seek(FX_STREAMSEEK eSeek, FX_FILESIZE iOffset) override; - bool IsEOF() const override { return m_iPosition >= m_wsBuffer.GetLength(); } - FX_STRSIZE ReadString(wchar_t* pStr, - FX_STRSIZE iMaxLength, - bool* bEOS) override; - void WriteString(const CFX_WideStringC& str) override {} - uint16_t GetCodePage() const override { - return sizeof(wchar_t) == 2 ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE; - } - void SetCodePage(uint16_t wCodePage) override {} - - private: - explicit CFGAS_WideStringReadStream(const CFX_WideString& wsBuffer); - ~CFGAS_WideStringReadStream() override; - - CFX_WideString m_wsBuffer; - FX_FILESIZE m_iPosition; -}; - // Returns {src bytes consumed, dst bytes produced}. std::pair UTF8Decode(const char* pSrc, FX_STRSIZE srcLen, @@ -366,41 +336,6 @@ void CFGAS_Stream::WriteString(const CFX_WideStringC& str) { WriteData(str); } -CFGAS_WideStringReadStream::CFGAS_WideStringReadStream( - const CFX_WideString& wsBuffer) - : m_wsBuffer(wsBuffer), m_iPosition(0) {} - -CFGAS_WideStringReadStream::~CFGAS_WideStringReadStream() {} - -void CFGAS_WideStringReadStream::Seek(FX_STREAMSEEK eSeek, - FX_FILESIZE iOffset) { - switch (eSeek) { - case FX_STREAMSEEK_Begin: - m_iPosition = iOffset; - break; - case FX_STREAMSEEK_Current: - m_iPosition += iOffset; - break; - } - m_iPosition = pdfium::clamp(m_iPosition, static_cast(0), - static_cast(m_wsBuffer.GetLength())); -} - -FX_STRSIZE CFGAS_WideStringReadStream::ReadString(wchar_t* pStr, - FX_STRSIZE iMaxLength, - bool* bEOS) { - iMaxLength = - std::min(iMaxLength, - static_cast(m_wsBuffer.GetLength() - m_iPosition)); - if (iMaxLength == 0) - return 0; - - FXSYS_wcsncpy(pStr, m_wsBuffer.c_str() + m_iPosition, iMaxLength); - m_iPosition += iMaxLength; - *bEOS = IsEOF(); - return iMaxLength; -} - } // namespace // static @@ -420,9 +355,3 @@ CFX_RetainPtr IFGAS_Stream::CreateWriteStream( return pdfium::MakeRetain(pFileWrite, true); } - -// static -CFX_RetainPtr IFGAS_Stream::CreateWideStringReadStream( - const CFX_WideString& buffer) { - return pdfium::MakeRetain(buffer); -} diff --git a/xfa/fgas/crt/ifgas_stream.h b/xfa/fgas/crt/ifgas_stream.h index 620a023dd8..acc9f1c4eb 100644 --- a/xfa/fgas/crt/ifgas_stream.h +++ b/xfa/fgas/crt/ifgas_stream.h @@ -22,8 +22,6 @@ class IFGAS_Stream : public CFX_Retainable { const CFX_RetainPtr& pFileRead); static CFX_RetainPtr CreateWriteStream( const CFX_RetainPtr& pFileWrite); - static CFX_RetainPtr CreateWideStringReadStream( - const CFX_WideString& buffer); virtual FX_FILESIZE GetLength() const = 0; virtual FX_FILESIZE GetPosition() = 0; diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp index d29df39e8e..90e93fbda5 100644 --- a/xfa/fxfa/parser/cxfa_node.cpp +++ b/xfa/fxfa/parser/cxfa_node.cpp @@ -996,8 +996,8 @@ void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) { const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = resoveNodeRS.pScriptAttribute; if (lpAttributeInfo && lpAttributeInfo->eValueType == XFA_SCRIPT_Object) { - std::unique_ptr pValue( - new CFXJSE_Value(pScriptContext->GetRuntime())); + auto pValue = + pdfium::MakeUnique(pScriptContext->GetRuntime()); (resoveNodeRS.objects.front()->*(lpAttributeInfo->lpfnCallback))( pValue.get(), false, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); pArguments->GetReturnValue()->Assign(pValue.get()); @@ -1271,25 +1271,21 @@ void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) { ThrowParamCountMismatchException(L"loadXML"); return; } - CFX_WideString wsExpression; + bool bIgnoreRoot = true; bool bOverwrite = 0; - wsExpression = - CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC()); + CFX_ByteString wsExpression = pArguments->GetUTF8String(0); if (wsExpression.IsEmpty()) return; if (iLength >= 2) bIgnoreRoot = !!pArguments->GetInt32(1); if (iLength >= 3) bOverwrite = !!pArguments->GetInt32(2); - std::unique_ptr pParser( - new CXFA_SimpleParser(m_pDocument, false)); + auto pParser = pdfium::MakeUnique(m_pDocument, false); if (!pParser) return; - CFDE_XMLNode* pXMLNode = nullptr; - int32_t iParserStatus = - pParser->ParseXMLData(wsExpression, pXMLNode, nullptr); - if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) + CFDE_XMLNode* pXMLNode = pParser->ParseXMLData(wsExpression, nullptr); + if (!pXMLNode) return; if (bIgnoreRoot && (pXMLNode->GetType() != FDE_XMLNODE_Element || diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp index 806e5445a0..1ebed10b4d 100644 --- a/xfa/fxfa/parser/cxfa_simple_parser.cpp +++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp @@ -317,30 +317,24 @@ int32_t CXFA_SimpleParser::DoParse(IFX_Pause* pPause) { return XFA_PARSESTATUS_Done; } -int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML, - CFDE_XMLNode*& pXMLNode, - IFX_Pause* pPause) { +CFDE_XMLNode* CXFA_SimpleParser::ParseXMLData(const CFX_ByteString& wsXML, + IFX_Pause* pPause) { CloseParser(); - pXMLNode = nullptr; m_pXMLDoc = pdfium::MakeUnique(); + CFX_RetainPtr pStream = - IFGAS_Stream::CreateWideStringReadStream(wsXML); + IFGAS_Stream::CreateReadStream(IFX_MemoryStream::Create( + const_cast(wsXML.raw_str()), wsXML.GetLength())); auto pParser = pdfium::MakeUnique(m_pXMLDoc->GetRoot(), pStream); pParser->m_dwCheckStatus = 0x03; if (!m_pXMLDoc->LoadXML(std::move(pParser))) - return XFA_PARSESTATUS_StatusErr; + return nullptr; int32_t iRet = m_pXMLDoc->DoLoad(pPause); if (iRet < 0 || iRet >= 100) m_pXMLDoc->CloseXML(); - if (iRet < 0) - return XFA_PARSESTATUS_SyntaxErr; - if (iRet < 100) - return iRet / 2; - - pXMLNode = GetDocumentNode(m_pXMLDoc.get()); - return XFA_PARSESTATUS_Done; + return iRet < 100 ? nullptr : GetDocumentNode(m_pXMLDoc.get()); } void CXFA_SimpleParser::ConstructXFANode(CXFA_Node* pXFANode, diff --git a/xfa/fxfa/parser/cxfa_simple_parser.h b/xfa/fxfa/parser/cxfa_simple_parser.h index ccb258a7d4..7671e8d740 100644 --- a/xfa/fxfa/parser/cxfa_simple_parser.h +++ b/xfa/fxfa/parser/cxfa_simple_parser.h @@ -29,9 +29,7 @@ class CXFA_SimpleParser { int32_t StartParse(const CFX_RetainPtr& pStream, XFA_XDPPACKET ePacketID); int32_t DoParse(IFX_Pause* pPause); - int32_t ParseXMLData(const CFX_WideString& wsXML, - CFDE_XMLNode*& pXMLNode, - IFX_Pause* pPause); + CFDE_XMLNode* ParseXMLData(const CFX_ByteString& wsXML, IFX_Pause* pPause); void ConstructXFANode(CXFA_Node* pXFANode, CFDE_XMLNode* pXMLNode); CXFA_Node* GetRootNode() const; CFDE_XMLDoc* GetXMLDoc() const; -- cgit v1.2.3