sw/qa/extras/ooxmlexport/data/tdf116371.odt |binary sw/qa/extras/ooxmlexport/ooxmlexport13.cxx | 10 +++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 37 ++++++++++++++++----------- ucb/source/ucp/webdav-neon/NeonSession.cxx | 14 ++++++++-- ucb/source/ucp/webdav-neon/NeonSession.hxx | 1 ucb/source/ucp/webdav-neon/webdavcontent.cxx | 10 ++----- 6 files changed, 50 insertions(+), 22 deletions(-)
New commits: commit 0ba1cb36688baff5814ae61163d401f2ecb39e31 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Jan 8 05:47:04 2019 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 13:57:52 2019 +0200 Don't crash when accessing WebDAV resource after auth failed In my testing on Windows, the crashing scenario was this: 1. FileDialogHelper_Impl::updateVersions() creates storage calling comphelper::OStorageHelper::GetStorageFromURL; 2. Content::openStream() calls isDocument first; 3. Content::isDocument() indirectly initiates WebDAV session, creating a NeonSession; 4. All operations of NeonSession call Init() first; its first call initializes m_pHttpSession using ne_session_create, and then adds auth callbacks using ne_add_server_auth/ne_add_proxy_auth 5. Then NeonSession performs the rest of PROPFIND task, calling ah_post_send and auth_challenge; the latter fails, then ah_post_send calls clean_session, which cleans m_pHttpSession's auth_session's sspi_host; 6. NeonSession::HandleError throws DAVException for NE_AUTH error; 7. Content::isDocument() returns true to Content::openStream(), which proceeds to execute the command, which in turn re-uses the NeonSession and its m_pHttpSession; 8. NeonSession::OPTIONS then indirectly calls continue_sspi, which tries to dereference the m_pHttpSession's auth_session's sspi_host which is nullptr at this point. So in case NeonSession detects the NE_AUTH error condition, let's set a flag indicating that the next Init() should reinitialize its m_pHttpSession. Also fixed a case when xProps was used before initialization in Content::getPropertyValues. Change-Id: Ifc9eec4fe0333ff6be17c5089068441b4a6eb78c Reviewed-on: https://gerrit.libreoffice.org/65950 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit 162a472d55cf9fb9aaa6d5eae625b3da2273a516) Reviewed-on: https://gerrit.libreoffice.org/74261 Tested-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/ucb/source/ucp/webdav-neon/NeonSession.cxx b/ucb/source/ucp/webdav-neon/NeonSession.cxx index c10796a48e79..164d30e56ae3 100644 --- a/ucb/source/ucp/webdav-neon/NeonSession.cxx +++ b/ucb/source/ucp/webdav-neon/NeonSession.cxx @@ -671,7 +671,8 @@ void NeonSession::Init() { osl::Guard< osl::Mutex > theGuard( m_aMutex ); - bool bCreateNewSession = false; + bool bCreateNewSession = m_bNeedNewSession; + m_bNeedNewSession = false; if ( m_pHttpSession == nullptr ) { @@ -725,13 +726,17 @@ void NeonSession::Init() m_aProxyName = rProxyCfg.aName; m_nProxyPort = rProxyCfg.nPort; + bCreateNewSession = true; + } + + if (bCreateNewSession) + { // new session needed, destroy old first { osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex()); ne_session_destroy( m_pHttpSession ); } m_pHttpSession = nullptr; - bCreateNewSession = true; } } @@ -1966,6 +1971,11 @@ void NeonSession::HandleError( int nError, m_aHostName, m_nPort ) ); case NE_AUTH: // User authentication failed on server + // m_pHttpSession could get invalidated, e.g., as result of clean_session called in + // ah_post_send in case when auth_challenge failed, which invalidates the auth_session + // which we established in Init(): the auth_session's sspi_host gets disposed, and + // next attempt to authenticate would crash in continue_sspi trying to dereference it + m_bNeedNewSession = true; throw DAVException( DAVException::DAV_HTTP_AUTH, NeonUri::makeConnectionEndPointString( m_aHostName, m_nPort ) ); diff --git a/ucb/source/ucp/webdav-neon/NeonSession.hxx b/ucb/source/ucp/webdav-neon/NeonSession.hxx index 2adebaacd3fd..df4522da6e18 100644 --- a/ucb/source/ucp/webdav-neon/NeonSession.hxx +++ b/ucb/source/ucp/webdav-neon/NeonSession.hxx @@ -54,6 +54,7 @@ private: sal_Int32 m_nProxyPort; css::uno::Sequence< css::beans::NamedValue > const m_aFlags; HttpSession * m_pHttpSession; + bool m_bNeedNewSession = false; // Something happened that could invalidate m_pHttpSession void * const m_pRequestData; const ucbhelper::InternetProxyDecider & m_rProxyDecider; diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx index 4616957b0725..6bec3d3e9300 100644 --- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx +++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx @@ -1586,12 +1586,10 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues( if ( eType == DAV ) { - //xProps.reset( - // new ContentProperties( aUnescapedTitle ) ); - xProps->addProperty( - "Title", - uno::makeAny( aUnescapedTitle ), - true ); + if (!xProps) + xProps.reset(new ContentProperties(aUnescapedTitle)); + else + xProps->addProperty("Title", uno::makeAny(aUnescapedTitle), true); } else { commit 6ec61d46f1cbd60d5911a72070cabc6bc63add50 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Sat Jan 26 17:13:28 2019 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Jun 18 13:57:43 2019 +0200 tdf#116371: export rotation of SwGrfNode Change-Id: I42620da798a35dfada67d9a9fb23d554cc20b16f Reviewed-on: https://gerrit.libreoffice.org/66963 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit b226383a83e41bbced9fc2a02dc09a449401ec97) Reviewed-on: https://gerrit.libreoffice.org/74262 Tested-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/qa/extras/ooxmlexport/data/tdf116371.odt b/sw/qa/extras/ooxmlexport/data/tdf116371.odt new file mode 100644 index 000000000000..257696616e8c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116371.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx index d9f1978705cf..8b3665b3c81f 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx @@ -119,6 +119,16 @@ DECLARE_OOXMLEXPORT_TEST(testTdf125324, "tdf125324.docx") assertXPath(pXmlDoc, "/root/page/body/txt[2]/anchored/fly/tab/infos/bounds", "top", "4193"); } +DECLARE_OOXMLEXPORT_TEST(testTdf116371, "tdf116371.odt") +{ + // Make sure the rotation is exported correctly, and size not distorted + auto xShape(getShape(1)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4700.0, getProperty<double>(xShape, "RotateAngle"), 10); + auto frameRect = getProperty<awt::Rectangle>(xShape, "FrameRect"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24070), frameRect.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24188), frameRect.Width); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 0438a1e54caf..02745ac0654a 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4889,7 +4889,27 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size CharGrabBag(*pGrabBag); } - m_rExport.SdrExporter().startDMLAnchorInline(pFrameFormat, rSize); + rtl::Reference<sax_fastparser::FastAttributeList> xFrameAttributes( + FastSerializerHelper::createAttrList()); + Size aSize = rSize; + if (pGrfNode) + { + const SwAttrSet& rSet = pGrfNode->GetSwAttrSet(); + MirrorGraph eMirror = rSet.Get(RES_GRFATR_MIRRORGRF).GetValue(); + if (eMirror == MirrorGraph::Vertical || eMirror == MirrorGraph::Both) + // Mirror on the vertical axis is a horizontal flip. + xFrameAttributes->add(XML_flipH, "1"); + // RES_GRFATR_ROTATION is sal_uInt16; use sal_uInt32 for multiplication later + if (sal_uInt32 nRot = rSet.Get(RES_GRFATR_ROTATION).GetValue()) + { + // RES_GRFATR_ROTATION is in 10ths of degree; convert to 100ths for macro + sal_uInt32 mOOXMLRot = OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY(nRot*10); + xFrameAttributes->add(XML_rot, OString::number(mOOXMLRot)); + aSize = pGrfNode->GetTwipSize(); + } + } + + m_rExport.SdrExporter().startDMLAnchorInline(pFrameFormat, aSize); // picture description (used for pic:cNvPr later too) ::sax_fastparser::FastAttributeList* docPrattrList = FastSerializerHelper::createAttrList(); @@ -4996,25 +5016,14 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size XML_bwMode, "auto", FSEND ); - rtl::Reference<sax_fastparser::FastAttributeList> xFrameAttributes( - FastSerializerHelper::createAttrList()); - - if (pGrfNode) - { - MirrorGraph eMirror = pGrfNode->GetSwAttrSet().Get(RES_GRFATR_MIRRORGRF).GetValue(); - if (eMirror == MirrorGraph::Vertical || eMirror == MirrorGraph::Both) - // Mirror on the vertical axis is a horizontal flip. - xFrameAttributes->add(XML_flipH, "1"); - } - m_pSerializer->startElementNS( XML_a, XML_xfrm, uno::Reference<xml::sax::XFastAttributeList>(xFrameAttributes.get())); m_pSerializer->singleElementNS( XML_a, XML_off, XML_x, "0", XML_y, "0", FSEND ); - OString aWidth( OString::number( TwipsToEMU( rSize.Width() ) ) ); - OString aHeight( OString::number( TwipsToEMU( rSize.Height() ) ) ); + OString aWidth( OString::number( TwipsToEMU( aSize.Width() ) ) ); + OString aHeight( OString::number( TwipsToEMU( aSize.Height() ) ) ); m_pSerializer->singleElementNS( XML_a, XML_ext, XML_cx, aWidth.getStr(), XML_cy, aHeight.getStr(), _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits