[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1036766: unblock: libreoffice/4:7.4.5-3



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: libreoffice@packages.debian.org, team@security.debian.org
Control: affects -1 + src:libreoffice

Please unblock package libreoffice

[ Reason ]
1. Main reason is CVE-2023-2255 and CVE-2023-0950.

2. I had two changelog commits in my tree.
   One is just documentation () and the other one fixes a simple
   spelling error which lintian loudly complains about.
   (cf. https://udd.debian.org/lintian/?email1=&email2=&email3=&packages=libreoffice&ignpackages=&format=html&lt_error=on&lt_warning=on&lintian_tag=spelling-error-in-changelog#all)
   That should be a no-brainer.

3. My tree also included the commit to make ulimit -c calls not fatal.
   Since the bookworm update on ci this fails in lxc. There was a config
   change (to be) deployed to prevent that but either it didn't happen
   or was reverted. It still fails.
   So we probably should include it, experimental has it for ages
   already.

[ Impact ]
for 1. vulnerable LibreOffice

   While we could do this via bookworm-security probably I think we can avoid this since we do have
   enough time..

for 3. autopkgtests still failing on ci.d.n inside lxc

[ Tests ]
Not sure whether the automatic tests cover this part.
It obviously builds ;)

[ Risks ]
The diff is big but the patch is taken verbatim from upstream 7.5
branch with just minor adaptions which are not risky (CVE-2023-2255)
and upstream 7.4.6 (CVE-2023-0950)

The ulimit -c changes are already in experimental.

The changelog fix/the addition do not have any risk at all (and it is
also already in experimental)

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

unblock libreoffice/4:7.4.5-3
age-days 2 libreoffice/4:7.4.5-3

diff -Nru libreoffice-7.4.5/debian/changelog libreoffice-7.4.5/debian/changelog
--- libreoffice-7.4.5/debian/changelog	2023-02-05 18:40:59.000000000 +0100
+++ libreoffice-7.4.5/debian/changelog	2023-05-22 18:00:45.000000000 +0200
@@ -1,3 +1,17 @@
+libreoffice (4:7.4.5-3) unstable; urgency=high
+
+  * debian/patches/sc-stack-parameter-count.diff: fix CVE-2023-0950
+    ("Array Index UnderFlow in Calc Formula Parsing")
+  * debian/rules, debian/tests/*: don't fail if ulimit -c unlimited fails 
+    (like in ci.d.n infrastructure after the bookworm upgrade...)
+  * debian/patches/CVE-2023-2255.diff:
+    fix CVE-2023-2555 ("Remote documents loaded without prompt via IFrame")
+  * debian/changelog:
+    - mention CVE-2022-38745 in 1:7.3.1-1s changelog
+    - fix typo in last upload (s/choosen/chosen/), thanks lintian
+
+ -- Rene Engelhard <rene@debian.org>  Mon, 22 May 2023 18:00:45 +0200
+
 libreoffice (4:7.4.5-2) unstable; urgency=medium
 
   * fontconfig-2.14.1-no-RGB-stripes-layout-for-sub-pixel-rendering.diff:
@@ -5,7 +19,7 @@
   * debian/control.in:
     - ... but build-conflict against affected fontconfig-configs (with
       <!nocheck>) instead since it now removes the offending config per default
-      (buildd chroot...) if not choosen otherwise via debconf (see #1030000)
+      (buildd chroot...) if not chosen otherwise via debconf (see #1030000)
   * debian/rules:
     - Do not add documentation symlinks when not building documentation,
       thanks Vagrant Cascadian (closes: #1030270)
@@ -502,6 +516,8 @@
 libreoffice (1:7.3.1-1) unstable; urgency=medium
 
   * LibreOffice 7.3.1 final release
+    - fixes CVE-2022-38745: "Empty entry in Java class path risks arbitrary
+      code execution"
 
  -- Rene Engelhard <rene@debian.org>  Thu, 03 Mar 2022 17:24:16 +0000
 
diff -Nru libreoffice-7.4.5/debian/patches/CVE-2023-2255.diff libreoffice-7.4.5/debian/patches/CVE-2023-2255.diff
--- libreoffice-7.4.5/debian/patches/CVE-2023-2255.diff	1970-01-01 01:00:00.000000000 +0100
+++ libreoffice-7.4.5/debian/patches/CVE-2023-2255.diff	2023-05-20 12:21:27.000000000 +0200
@@ -0,0 +1,946 @@
+From 683e4de0de8dde7c5570c67cbd2bae17b6d7f0e0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
+Date: Tue, 11 Apr 2023 10:13:37 +0100
+Subject: set Referer on loading IFrames
+
+so tools, options, security, options,
+"block any links from document not..."
+applies to their contents.
+
+Change-Id: I04839aea6b07a4a76ac147a85045939ccd9c3c79
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150225
+Tested-by: Jenkins
+Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
+---
+ sfx2/source/doc/iframe.cxx | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+From 49a554471cddc3e52ae381f864e689fe4a8c6131 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
+Date: Thu, 13 Apr 2023 11:31:17 +0100
+Subject: put floating frames under managed links control
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+like we do for sections and ole objects that link to their content
+
+individual commits in trunk are:
+
+extract a OCommonEmbeddedObject::SetInplaceActiveState for reuse
+
+no behaviour change intended
+
+Change-Id: Ia1d12aa5c9afdc1347f6d4364bc6a0b7f41ee168
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150341
+Tested-by: Caolán McNamara <caolanm@redhat.com>
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 183e34a3f8c429c0698951e24c17844e416a3825)
+
+use parent window as dialog parent
+
+it makes no odds, but is more convenient for upcoming modification
+
+Change-Id: Ibc5333b137d2da089b3b701ff615c6ddf43063d0
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150342
+Tested-by: Caolán McNamara <caolanm@redhat.com>
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit f93edf343658abd489bde3639d2ffaefd50c0f99)
+
+adjust IFrameObject so it could reuse mxFrame for a reload of content
+
+Change-Id: I7eec3132a23faafd9a2878215a0a117a67bc9bf2
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150343
+Tested-by: Caolán McNamara <caolanm@redhat.com>
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 3a727d26fd9eb6fa140bc3f5cadf3db079d42206)
+
+query getUserAllowsLinkUpdate for the case of content in a floating frame
+
+similarly to how it works for the more common "normal" embedded objects
+
+Change-Id: I83e38dfa2f84907c2de9680e91f779d34864a9ad
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149971
+Tested-by: Jenkins
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 52aa46468531918eabfa2031dedf50377ae72cf7)
+
+add a route to get writer Floating Frame links under 'manage links'
+
+Change-Id: If90ff71d6a96342574799312f764badaf97980eb
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150349
+Tested-by: Jenkins
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 8b8a2844addbd262befb1a2d193dfb590dfa20be)
+
+allow SvxOle2Shape::resetModifiedState to survive having no SdrObject
+
+Change-Id: Iea059262c124e3f44249e49b4189732310d28156
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150538
+Tested-by: Jenkins
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 02379929bd0e1d1676635f0ca1920422702ebb7c)
+
+create the FloatingFrameShape in a separate step to inserting it
+
+this is derived from the path taken by the AddShape(const OUString&)
+function for this case. No change in behavior is intended.
+
+Change-Id: Id09ae0c65a55a37743ad7c184070fb8dd97d8a7f
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150526
+Tested-by: Jenkins
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit bafec47847a0b9697b3bbe9358e53f8118af3024)
+
+add a route to get calc Floating Frame links under 'manage links'
+
+much harder than writer because the organization and ordering
+of properties and object activation etc is different.
+
+This ended up ugly, but functions.
+
+We set FrameURL before AddShape, we have to do it again later because it
+gets cleared when the SdrOle2Obj is attached to the XShape.  But we want
+FrameURL to exist when AddShape triggers SetPersistName which itself
+triggers SdrOle2Obj::CheckFileLink_Impl and at that point we want to
+know what URL will end up being used. So bodge this by setting FrameURL
+to the temp pre-SdrOle2Obj attached properties and we can smuggle it
+eventually into SdrOle2Obj::SetPersistName at the right point after
+PersistName is set but before SdrOle2Obj::CheckFileLink_Impl is called
+in order to inform the link manager that this is an IFrame that links to
+a URL
+
+Change-Id: I67fc199fef9e67fa12ca7873f0fe12137aa16d8f
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150539
+Tested-by: Jenkins
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit 07179a5a5bd00f34acfa8a3f260dd834ae003c63)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150753
+Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
+---
+ embeddedobj/source/commonembedding/embedobj.cxx    |  60 ++++++------
+ .../source/commonembedding/specialobject.cxx       |   9 ++
+ embeddedobj/source/inc/commonembobj.hxx            |   3 +
+ embeddedobj/source/inc/specialobject.hxx           |   6 ++
+ include/svx/svdoole2.hxx                           |  17 +++-
+ include/svx/unoshape.hxx                           |   2 +
+ sc/source/ui/docshell/documentlinkmgr.cxx          |   9 +-
+ sfx2/source/doc/iframe.cxx                         |  55 +++++++----
+ svx/source/svdraw/svdoole2.cxx                     | 104 +++++++++++++++++----
+ svx/source/unodraw/shapeimpl.hxx                   |   5 +
+ svx/source/unodraw/unoshap4.cxx                    |  23 ++++-
+ sw/inc/ndole.hxx                                   |   4 +-
+ sw/source/core/ole/ndole.cxx                       |  89 ++++++++++++++++--
+ xmloff/source/draw/ximpshap.cxx                    |  29 +++++-
+ xmloff/source/draw/ximpshap.hxx                    |   2 +
+ 15 files changed, 331 insertions(+), 86 deletions(-)
+
+From 26a8966b07f6335450ddbf4b0f5d5206db43bcbf Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
+Date: Thu, 20 Apr 2023 20:58:21 +0100
+Subject: assume IFrame script/macro support isn't needed
+
+seems undocumented at least
+
+Change-Id: I316e4f4f25ddb7cf6b7bac4d856a721b987207a3
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151019
+Tested-by: Jenkins
+Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
+---
+ sfx2/source/doc/iframe.cxx        | 15 ++++-----------
+ sfx2/source/inc/eventsupplier.hxx |  1 +
+ 2 files changed, 5 insertions(+), 11 deletions(-)
+
+diff --git a/embeddedobj/source/commonembedding/embedobj.cxx b/embeddedobj/source/commonembedding/embedobj.cxx
+index 0b1cb5785dac..ef627941921e 100644
+--- a/embeddedobj/source/commonembedding/embedobj.cxx
++++ b/embeddedobj/source/commonembedding/embedobj.cxx
+@@ -216,6 +216,37 @@ void OCommonEmbeddedObject::StateChangeNotification_Impl( bool bBeforeChange, sa
+     rGuard.reset();
+ }
+ 
++void OCommonEmbeddedObject::SetInplaceActiveState()
++{
++    if ( !m_xClientSite.is() )
++        throw embed::WrongStateException( "client site not set, yet", *this );
++
++    uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY );
++    if ( !xInplaceClient.is() || !xInplaceClient->canInplaceActivate() )
++        throw embed::WrongStateException(); //TODO: can't activate inplace
++    xInplaceClient->activatingInplace();
++
++    uno::Reference< embed::XWindowSupplier > xClientWindowSupplier( xInplaceClient, uno::UNO_QUERY_THROW );
++
++    m_xClientWindow = xClientWindowSupplier->getWindow();
++    m_aOwnRectangle = xInplaceClient->getPlacement();
++    m_aClipRectangle = xInplaceClient->getClipRectangle();
++    awt::Rectangle aRectangleToShow = GetRectangleInterception( m_aOwnRectangle, m_aClipRectangle );
++
++    // create own window based on the client window
++    // place and resize the window according to the rectangles
++    uno::Reference< awt::XWindowPeer > xClientWindowPeer( m_xClientWindow, uno::UNO_QUERY_THROW );
++
++    // dispatch provider may not be provided
++    uno::Reference< frame::XDispatchProvider > xContainerDP = xInplaceClient->getInplaceDispatchProvider();
++    bool bOk = m_xDocHolder->ShowInplace( xClientWindowPeer, aRectangleToShow, xContainerDP );
++    m_nObjectState = embed::EmbedStates::INPLACE_ACTIVE;
++    if ( !bOk )
++    {
++        SwitchStateTo_Impl( embed::EmbedStates::RUNNING );
++        throw embed::WrongStateException(); //TODO: can't activate inplace
++    }
++}
+ 
+ void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState )
+ {
+@@ -289,34 +320,7 @@ void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState )
+         {
+             if ( nNextState == embed::EmbedStates::INPLACE_ACTIVE )
+             {
+-                if ( !m_xClientSite.is() )
+-                    throw embed::WrongStateException( "client site not set, yet", *this );
+-
+-                uno::Reference< embed::XInplaceClient > xInplaceClient( m_xClientSite, uno::UNO_QUERY );
+-                if ( !xInplaceClient.is() || !xInplaceClient->canInplaceActivate() )
+-                    throw embed::WrongStateException(); //TODO: can't activate inplace
+-                xInplaceClient->activatingInplace();
+-
+-                uno::Reference< embed::XWindowSupplier > xClientWindowSupplier( xInplaceClient, uno::UNO_QUERY_THROW );
+-
+-                m_xClientWindow = xClientWindowSupplier->getWindow();
+-                m_aOwnRectangle = xInplaceClient->getPlacement();
+-                m_aClipRectangle = xInplaceClient->getClipRectangle();
+-                awt::Rectangle aRectangleToShow = GetRectangleInterception( m_aOwnRectangle, m_aClipRectangle );
+-
+-                // create own window based on the client window
+-                // place and resize the window according to the rectangles
+-                uno::Reference< awt::XWindowPeer > xClientWindowPeer( m_xClientWindow, uno::UNO_QUERY_THROW );
+-
+-                // dispatch provider may not be provided
+-                uno::Reference< frame::XDispatchProvider > xContainerDP = xInplaceClient->getInplaceDispatchProvider();
+-                bool bOk = m_xDocHolder->ShowInplace( xClientWindowPeer, aRectangleToShow, xContainerDP );
+-                m_nObjectState = nNextState;
+-                if ( !bOk )
+-                {
+-                    SwitchStateTo_Impl( embed::EmbedStates::RUNNING );
+-                    throw embed::WrongStateException(); //TODO: can't activate inplace
+-                }
++                SetInplaceActiveState();
+             }
+             else if ( nNextState == embed::EmbedStates::ACTIVE )
+             {
+diff --git a/embeddedobj/source/commonembedding/specialobject.cxx b/embeddedobj/source/commonembedding/specialobject.cxx
+index 809ffce1f2c4..3dc1eb7e47ef 100644
+--- a/embeddedobj/source/commonembedding/specialobject.cxx
++++ b/embeddedobj/source/commonembedding/specialobject.cxx
+@@ -48,6 +48,7 @@ uno::Any SAL_CALL OSpecialEmbeddedObject::queryInterface( const uno::Type& rType
+     uno::Any aReturn = ::cppu::queryInterface( rType,
+                                         static_cast< embed::XEmbeddedObject* >( this ),
+                                         static_cast< embed::XInplaceObject* >( this ),
++                                        static_cast< embed::XCommonEmbedPersist* >( static_cast< embed::XEmbedPersist* >( this ) ),
+                                         static_cast< embed::XVisualObject* >( this ),
+                                         static_cast< embed::XClassifiedObject* >( this ),
+                                         static_cast< embed::XComponentSupplier* >( this ),
+@@ -163,6 +164,14 @@ void SAL_CALL OSpecialEmbeddedObject::doVerb( sal_Int32 nVerbID )
+         OCommonEmbeddedObject::doVerb( nVerbID );
+ }
+ 
++void SAL_CALL OSpecialEmbeddedObject::reload(
++                const uno::Sequence< beans::PropertyValue >&,
++                const uno::Sequence< beans::PropertyValue >&)
++{
++    // Allow IFrames to reload their content
++    SetInplaceActiveState();
++}
++
+ OUString SAL_CALL OSpecialEmbeddedObject::getImplementationName()
+ {
+     return "com.sun.star.comp.embed.OSpecialEmbeddedObject";
+diff --git a/embeddedobj/source/inc/commonembobj.hxx b/embeddedobj/source/inc/commonembobj.hxx
+index 4f641737b468..f683b0acccc2 100644
+--- a/embeddedobj/source/inc/commonembobj.hxx
++++ b/embeddedobj/source/inc/commonembobj.hxx
+@@ -251,6 +251,9 @@ private:
+                     const css::uno::Sequence< css::beans::PropertyValue >& lArguments,
+                     const css::uno::Sequence< css::beans::PropertyValue >& lObjArgs );
+ 
++protected:
++    void SetInplaceActiveState();
++
+ public:
+     OCommonEmbeddedObject(
+         const css::uno::Reference< css::uno::XComponentContext >& rxContext,
+diff --git a/embeddedobj/source/inc/specialobject.hxx b/embeddedobj/source/inc/specialobject.hxx
+index 48d1d872a2a2..9ec0d7d86465 100644
+--- a/embeddedobj/source/inc/specialobject.hxx
++++ b/embeddedobj/source/inc/specialobject.hxx
+@@ -48,6 +48,12 @@ public:
+ 
+     virtual void SAL_CALL doVerb( sal_Int32 nVerbID ) override;
+ 
++// XCommonEmbedPersist
++
++    virtual void SAL_CALL reload(
++                const css::uno::Sequence< css::beans::PropertyValue >& lArguments,
++                const css::uno::Sequence< css::beans::PropertyValue >& lObjArgs ) override;
++
+     // XServiceInfo
+     OUString SAL_CALL getImplementationName() override;
+     sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx
+index ae6ff818bdf6..522bead958e6 100644
+--- a/include/svx/svdoole2.hxx
++++ b/include/svx/svdoole2.hxx
+@@ -42,6 +42,7 @@ namespace io { class XInputStream; }
+ namespace svt { class EmbeddedObjectRef; }
+ 
+ class SdrOle2ObjImpl;
++class SvxOle2Shape;
+ 
+ class SVXCORE_DLLPUBLIC SdrOle2Obj : public SdrRectObj
+ {
+@@ -49,7 +50,7 @@ private:
+     std::unique_ptr<SdrOle2ObjImpl> mpImpl;
+ 
+ private:
+-    SVX_DLLPRIVATE void Connect_Impl();
++    SVX_DLLPRIVATE void Connect_Impl(SvxOle2Shape* pCreator = nullptr);
+     SVX_DLLPRIVATE void Disconnect_Impl();
+     SVX_DLLPRIVATE void AddListeners_Impl();
+     SVX_DLLPRIVATE void RemoveListeners_Impl();
+@@ -107,7 +108,7 @@ public:
+     // OLE object has got a separate PersistName member now;
+     // !!! use ::SetPersistName( ... ) only, if you know what you do !!!
+     const OUString& GetPersistName() const;
+-    void        SetPersistName( const OUString& rPersistName );
++    void        SetPersistName( const OUString& rPersistName, SvxOle2Shape* pCreator = nullptr );
+ 
+     // One can add an application name to a SdrOle2Obj, which can be queried for
+     // later on (SD needs this for presentation objects).
+@@ -152,7 +153,7 @@ public:
+                                          sal_Int64 nAspect );
+     static bool Unload( const css::uno::Reference< css::embed::XEmbeddedObject >& xObj, sal_Int64 nAspect );
+     bool Unload();
+-    void Connect();
++    void Connect(SvxOle2Shape* pCreator = nullptr);
+     void Disconnect();
+     void ObjectLoaded();
+ 
+@@ -199,4 +200,14 @@ public:
+     void                Connect() { GetRealObject(); }
+ };
+ 
++class SVXCORE_DLLPUBLIC SdrIFrameLink final : public sfx2::SvBaseLink
++{
++    SdrOle2Obj* m_pObject;
++
++public:
++    explicit SdrIFrameLink(SdrOle2Obj* pObject);
++    virtual ::sfx2::SvBaseLink::UpdateResult DataChanged(
++        const OUString& rMimeType, const css::uno::Any & rValue ) override;
++};
++
+ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/include/svx/unoshape.hxx b/include/svx/unoshape.hxx
+index 6a898ceac515..3185d958a0e9 100644
+--- a/include/svx/unoshape.hxx
++++ b/include/svx/unoshape.hxx
+@@ -619,6 +619,8 @@ public:
+     bool createObject( const SvGlobalName &aClassName );
+ 
+     void createLink( const OUString& aLinkURL );
++
++    virtual OUString GetAndClearInitialFrameURL();
+ };
+ 
+ 
+diff --git a/sc/source/ui/docshell/documentlinkmgr.cxx b/sc/source/ui/docshell/documentlinkmgr.cxx
+index 3652df5cca0a..79a86d08b438 100644
+--- a/sc/source/ui/docshell/documentlinkmgr.cxx
++++ b/sc/source/ui/docshell/documentlinkmgr.cxx
+@@ -144,7 +144,7 @@ bool DocumentLinkManager::hasDdeOrOleOrWebServiceLinks(bool bDde, bool bOle, boo
+         sfx2::SvBaseLink* pBase = rLink.get();
+         if (bDde && dynamic_cast<ScDdeLink*>(pBase))
+             return true;
+-        if (bOle && dynamic_cast<SdrEmbedObjectLink*>(pBase))
++        if (bOle && (dynamic_cast<SdrEmbedObjectLink*>(pBase) || dynamic_cast<SdrIFrameLink*>(pBase)))
+             return true;
+         if (bWebService && dynamic_cast<ScWebServiceLink*>(pBase))
+             return true;
+@@ -175,6 +175,13 @@ bool DocumentLinkManager::updateDdeOrOleOrWebServiceLinks(weld::Window* pWin)
+             continue;
+         }
+ 
++        SdrIFrameLink* pIFrameLink = dynamic_cast<SdrIFrameLink*>(pBase);
++        if (pIFrameLink)
++        {
++            pIFrameLink->Update();
++            continue;
++        }
++
+         ScWebServiceLink* pWebserviceLink = dynamic_cast<ScWebServiceLink*>(pBase);
+         if (pWebserviceLink)
+         {
+diff --git a/sfx2/source/doc/iframe.cxx b/sfx2/source/doc/iframe.cxx
+index 80e0c4e68457..08dfee998c6d 100644
+--- a/sfx2/source/doc/iframe.cxx
++++ b/sfx2/source/doc/iframe.cxx
+@@ -38,6 +38,7 @@
+ #include <cppuhelper/supportsservice.hxx>
+ #include <officecfg/Office/Common.hxx>
+ #include <svl/itemprop.hxx>
++#include <sfx2/docfile.hxx>
+ #include <sfx2/frmdescr.hxx>
+ #include <sfx2/objsh.hxx>
+ #include <sfx2/sfxdlg.hxx>
+@@ -165,39 +166,56 @@ sal_Bool SAL_CALL IFrameObject::load(
+         uno::Reference < util::XURLTransformer > xTrans( util::URLTransformer::create( mxContext ) );
+         xTrans->parseStrict( aTargetURL );
+ 
+-        if (INetURLObject(aTargetURL.Complete).GetProtocol() == INetProtocol::Macro)
+-        {
+-            uno::Reference<frame::XFramesSupplier> xParentFrame = xFrame->getCreator();
+-            SfxObjectShell* pDoc = SfxMacroLoader::GetObjectShell(xParentFrame);
+-            if (pDoc && !pDoc->AdjustMacroMode())
+-                return false;
+-        }
++        INetURLObject aURLObject(aTargetURL.Complete);
++        if (aURLObject.GetProtocol() == INetProtocol::Macro || aURLObject.isSchemeEqualTo(u"vnd.sun.star.script"))
++            return false;
+ 
+-        DBG_ASSERT( !mxFrame.is(), "Frame already existing!" );
+-        VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() );
+-        VclPtr<IFrameWindow_Impl> pWin = VclPtr<IFrameWindow_Impl>::Create( pParent, maFrmDescr.IsFrameBorderOn() );
+-        pWin->SetSizePixel( pParent->GetOutputSizePixel() );
+-        pWin->SetBackground();
+-        pWin->Show();
++        uno::Reference<frame::XFramesSupplier> xParentFrame = xFrame->getCreator();
++        SfxObjectShell* pDoc = SfxMacroLoader::GetObjectShell(xParentFrame);
+ 
+-        uno::Reference < awt::XWindow > xWindow( pWin->GetComponentInterface(), uno::UNO_QUERY );
+-        xFrame->setComponent( xWindow, uno::Reference < frame::XController >() );
++        bool bUpdateAllowed(true);
++        if (pDoc)
++        {
++            comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = pDoc->getEmbeddedObjectContainer();
++            bUpdateAllowed = rEmbeddedObjectContainer.getUserAllowsLinkUpdate();
++        }
++        if (!bUpdateAllowed)
++            return false;
+ 
+-        // we must destroy the IFrame before the parent is destroyed
+-        xWindow->addEventListener( this );
++        OUString sReferer;
++        if (pDoc && pDoc->HasName())
++            sReferer = pDoc->GetMedium()->GetName();
+ 
+-        mxFrame = frame::Frame::create( mxContext );
+-        uno::Reference < awt::XWindow > xWin( pWin->GetComponentInterface(), uno::UNO_QUERY );
+-        mxFrame->initialize( xWin );
+-        mxFrame->setName( maFrmDescr.GetName() );
++        uno::Reference<css::awt::XWindow> xParentWindow(xFrame->getContainerWindow());
+ 
+-        uno::Reference < frame::XFramesSupplier > xFramesSupplier( xFrame, uno::UNO_QUERY );
+-        if ( xFramesSupplier.is() )
+-            mxFrame->setCreator( xFramesSupplier );
++        if (!mxFrame.is())
++        {
++            VclPtr<vcl::Window> pParent = VCLUnoHelper::GetWindow(xParentWindow);
++            VclPtr<IFrameWindow_Impl> pWin = VclPtr<IFrameWindow_Impl>::Create( pParent, maFrmDescr.IsFrameBorderOn() );
++            pWin->SetSizePixel( pParent->GetOutputSizePixel() );
++            pWin->SetBackground();
++            pWin->Show();
++
++            uno::Reference < awt::XWindow > xWindow( pWin->GetComponentInterface(), uno::UNO_QUERY );
++            xFrame->setComponent( xWindow, uno::Reference < frame::XController >() );
++
++            // we must destroy the IFrame before the parent is destroyed
++            xWindow->addEventListener( this );
++
++            mxFrame = frame::Frame::create( mxContext );
++            uno::Reference < awt::XWindow > xWin( pWin->GetComponentInterface(), uno::UNO_QUERY );
++            mxFrame->initialize( xWin );
++            mxFrame->setName( maFrmDescr.GetName() );
++
++            uno::Reference < frame::XFramesSupplier > xFramesSupplier( xFrame, uno::UNO_QUERY );
++            if ( xFramesSupplier.is() )
++                mxFrame->setCreator( xFramesSupplier );
++        }
+ 
+         uno::Sequence < beans::PropertyValue > aProps{
+             comphelper::makePropertyValue("PluginMode", sal_Int16(2)),
+-            comphelper::makePropertyValue("ReadOnly", true)
++            comphelper::makePropertyValue("ReadOnly", true),
++            comphelper::makePropertyValue("Referer", sReferer)
+         };
+         uno::Reference < frame::XDispatch > xDisp = mxFrame->queryDispatch( aTargetURL, "_self", 0 );
+         if ( xDisp.is() )
+diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx
+index 7bc3ee34e0d2..11024078228b 100644
+--- a/svx/source/svdraw/svdoole2.cxx
++++ b/svx/source/svdraw/svdoole2.cxx
+@@ -69,6 +69,7 @@
+ #include <sdr/contact/viewcontactofsdrole2obj.hxx>
+ #include <svx/svdograf.hxx>
+ #include <sdr/properties/oleproperties.hxx>
++#include <svx/unoshape.hxx>
+ #include <svx/xlineit0.hxx>
+ #include <svx/xlnclit.hxx>
+ #include <svx/xbtmpit.hxx>
+@@ -593,6 +594,35 @@ void SdrEmbedObjectLink::Closed()
+     SvBaseLink::Closed();
+ }
+ 
++SdrIFrameLink::SdrIFrameLink(SdrOle2Obj* pObject)
++    : ::sfx2::SvBaseLink(::SfxLinkUpdateMode::ONCALL, SotClipboardFormatId::SVXB)
++    , m_pObject(pObject)
++{
++    SetSynchron( false );
++}
++
++::sfx2::SvBaseLink::UpdateResult SdrIFrameLink::DataChanged(
++    const OUString&, const uno::Any& )
++{
++    uno::Reference<embed::XEmbeddedObject> xObject = m_pObject->GetObjRef();
++    uno::Reference<embed::XCommonEmbedPersist> xPersObj(xObject, uno::UNO_QUERY);
++    if (xPersObj.is())
++    {
++        // let the IFrameObject reload the link
++        try
++        {
++            xPersObj->reload(uno::Sequence<beans::PropertyValue>(), uno::Sequence<beans::PropertyValue>());
++        }
++        catch (const uno::Exception&)
++        {
++        }
++
++        m_pObject->SetChanged();
++    }
++
++    return SUCCESS;
++}
++
+ class SdrOle2ObjImpl
+ {
+ public:
+@@ -610,7 +640,7 @@ public:
+     bool mbLoadingOLEObjectFailed:1; // New local var to avoid repeated loading if load of OLE2 fails
+     bool mbConnected:1;
+ 
+-    SdrEmbedObjectLink* mpObjectLink;
++    sfx2::SvBaseLink* mpObjectLink;
+     OUString maLinkURL;
+ 
+     rtl::Reference<SvxUnoShapeModifyListener> mxModifyListener;
+@@ -852,7 +882,7 @@ bool SdrOle2Obj::IsEmpty() const
+     return !mpImpl->mxObjRef.is();
+ }
+ 
+-void SdrOle2Obj::Connect()
++void SdrOle2Obj::Connect(SvxOle2Shape* pCreator)
+ {
+     if( IsEmptyPresObj() )
+         return;
+@@ -865,7 +895,7 @@ void SdrOle2Obj::Connect()
+         return;
+     }
+ 
+-    Connect_Impl();
++    Connect_Impl(pCreator);
+     AddListeners_Impl();
+ }
+ 
+@@ -964,24 +994,51 @@ void SdrOle2Obj::CheckFileLink_Impl()
+ 
+     try
+     {
+-        uno::Reference< embed::XLinkageSupport > xLinkSupport( mpImpl->mxObjRef.GetObject(), uno::UNO_QUERY );
++        uno::Reference<embed::XEmbeddedObject> xObject = mpImpl->mxObjRef.GetObject();
++        if (!xObject)
++            return;
+ 
+-        if ( xLinkSupport.is() && xLinkSupport->isLink() )
+-        {
+-            OUString aLinkURL = xLinkSupport->getLinkURL();
++        bool bIFrame = false;
+ 
+-            if ( !aLinkURL.isEmpty() )
++        OUString aLinkURL;
++        uno::Reference<embed::XLinkageSupport> xLinkSupport(xObject, uno::UNO_QUERY);
++        if (xLinkSupport)
++        {
++            if (xLinkSupport->isLink())
++                aLinkURL = xLinkSupport->getLinkURL();
++        }
++        else
++        {
++            // get IFrame (Floating Frames) listed and updatable from the
++            // manage links dialog
++            SvGlobalName aClassId(xObject->getClassID());
++            if (aClassId == SvGlobalName(SO3_IFRAME_CLASSID))
+             {
+-                // this is a file link so the model link manager should handle it
+-                sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager());
++                uno::Reference<beans::XPropertySet> xSet(xObject->getComponent(), uno::UNO_QUERY);
++                if (xSet.is())
++                    xSet->getPropertyValue("FrameURL") >>= aLinkURL;
++                bIFrame = true;
++            }
++        }
++
++        if (!aLinkURL.isEmpty()) // this is a file link so the model link manager should handle it
++        {
++            sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager());
+ 
+-                if ( pLinkManager )
++            if ( pLinkManager )
++            {
++                SdrEmbedObjectLink* pEmbedObjectLink = nullptr;
++                if (!bIFrame)
+                 {
+-                    mpImpl->mpObjectLink = new SdrEmbedObjectLink( this );
+-                    mpImpl->maLinkURL = aLinkURL;
+-                    pLinkManager->InsertFileLink( *mpImpl->mpObjectLink, sfx2::SvBaseLinkObjectType::ClientOle, aLinkURL );
+-                    mpImpl->mpObjectLink->Connect();
++                    pEmbedObjectLink = new SdrEmbedObjectLink(this);
++                    mpImpl->mpObjectLink = pEmbedObjectLink;
+                 }
++                else
++                    mpImpl->mpObjectLink = new SdrIFrameLink(this);
++                mpImpl->maLinkURL = aLinkURL;
++                pLinkManager->InsertFileLink( *mpImpl->mpObjectLink, sfx2::SvBaseLinkObjectType::ClientOle, aLinkURL );
++                if (pEmbedObjectLink)
++                    pEmbedObjectLink->Connect();
+             }
+         }
+     }
+@@ -991,7 +1048,7 @@ void SdrOle2Obj::CheckFileLink_Impl()
+     }
+ }
+ 
+-void SdrOle2Obj::Connect_Impl()
++void SdrOle2Obj::Connect_Impl(SvxOle2Shape* pCreator)
+ {
+     if(mpImpl->aPersistName.isEmpty() )
+         return;
+@@ -1032,6 +1089,17 @@ void SdrOle2Obj::Connect_Impl()
+             }
+         }
+ 
++        if (pCreator)
++        {
++            OUString sFrameURL(pCreator->GetAndClearInitialFrameURL());
++            if (!sFrameURL.isEmpty() && svt::EmbeddedObjectRef::TryRunningState(mpImpl->mxObjRef.GetObject()))
++            {
++                uno::Reference<beans::XPropertySet> xSet(mpImpl->mxObjRef->getComponent(), uno::UNO_QUERY);
++                if (xSet.is())
++                    xSet->setPropertyValue("FrameURL", uno::Any(sFrameURL));
++            }
++        }
++
+         if ( mpImpl->mxObjRef.is() )
+         {
+             if ( !mpImpl->mxLightClient.is() )
+@@ -1342,14 +1410,14 @@ SdrObjectUniquePtr SdrOle2Obj::getFullDragClone() const
+     return createSdrGrafObjReplacement(false);
+ }
+ 
+-void SdrOle2Obj::SetPersistName( const OUString& rPersistName )
++void SdrOle2Obj::SetPersistName( const OUString& rPersistName, SvxOle2Shape* pCreator )
+ {
+     DBG_ASSERT( mpImpl->aPersistName.isEmpty(), "Persist name changed!");
+ 
+     mpImpl->aPersistName = rPersistName;
+     mpImpl->mbLoadingOLEObjectFailed = false;
+ 
+-    Connect();
++    Connect(pCreator);
+     SetChanged();
+ }
+ 
+diff --git a/svx/source/unodraw/shapeimpl.hxx b/svx/source/unodraw/shapeimpl.hxx
+index 44b3bcdea0e2..68189814fe6a 100644
+--- a/svx/source/unodraw/shapeimpl.hxx
++++ b/svx/source/unodraw/shapeimpl.hxx
+@@ -64,8 +64,11 @@ public:
+ 
+     virtual void Create( SdrObject* pNewOpj, SvxDrawPage* pNewPage ) override;
+ };
++
+ class SvxFrameShape : public SvxOle2Shape
+ {
++private:
++    OUString m_sInitialFrameURL;
+ protected:
+     // override these for special property handling in subcasses. Return true if property is handled
+     virtual bool setPropertyValueImpl( const OUString& rName, const SfxItemPropertyMapEntry* pProperty, const css::uno::Any& rValue ) override;
+@@ -82,6 +85,8 @@ public:
+     virtual void SAL_CALL setPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues ) override;
+ 
+     virtual void Create( SdrObject* pNewOpj, SvxDrawPage* pNewPage ) override;
++
++    virtual OUString GetAndClearInitialFrameURL() override;
+ };
+ 
+ SvxUnoPropertyMapProvider& getSvxMapProvider();
+diff --git a/svx/source/unodraw/unoshap4.cxx b/svx/source/unodraw/unoshap4.cxx
+index 3a1d2eda3402..18ce14f5e22d 100644
+--- a/svx/source/unodraw/unoshap4.cxx
++++ b/svx/source/unodraw/unoshap4.cxx
+@@ -177,7 +177,7 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro
+ #else
+             pOle = static_cast<SdrOle2Obj*>(GetSdrObject());
+ #endif
+-            pOle->SetPersistName( aPersistName );
++            pOle->SetPersistName( aPersistName, this );
+             return true;
+         }
+         break;
+@@ -498,10 +498,11 @@ void SvxOle2Shape::createLink( const OUString& aLinkURL )
+ 
+ void SvxOle2Shape::resetModifiedState()
+ {
+-    ::comphelper::IEmbeddedHelper* pPersist = GetSdrObject()->getSdrModelFromSdrObject().GetPersist();
++    SdrObject* pObject = GetSdrObject();
++    ::comphelper::IEmbeddedHelper* pPersist = pObject ? pObject->getSdrModelFromSdrObject().GetPersist() : nullptr;
+     if( pPersist && !pPersist->isEnableSetModified() )
+     {
+-        SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( GetSdrObject() );
++        SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >(pObject);
+         if( pOle && !pOle->IsEmpty() )
+         {
+             uno::Reference < util::XModifiable > xMod( pOle->GetObjRef(), uno::UNO_QUERY );
+@@ -551,6 +552,11 @@ SvGlobalName SvxOle2Shape::GetClassName_Impl(OUString& rHexCLSID)
+     return aClassName;
+ }
+ 
++OUString SvxOle2Shape::GetAndClearInitialFrameURL()
++{
++    return OUString();
++}
++
+ SvxAppletShape::SvxAppletShape(SdrObject* pObject)
+     : SvxOle2Shape( pObject, getSvxMapProvider().GetMap(SVXMAP_APPLET), getSvxMapProvider().GetPropertySet(SVXMAP_APPLET, SdrObject::GetGlobalDrawObjectItemPool())  )
+ {
+@@ -704,8 +710,19 @@ SvxFrameShape::~SvxFrameShape() noexcept
+ {
+ }
+ 
++OUString SvxFrameShape::GetAndClearInitialFrameURL()
++{
++    OUString sRet(m_sInitialFrameURL);
++    m_sInitialFrameURL.clear();
++    return sRet;
++}
++
+ void SvxFrameShape::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage )
+ {
++    uno::Reference<beans::XPropertySet> xSet(static_cast<OWeakObject *>(this), uno::UNO_QUERY);
++    if (xSet)
++        xSet->getPropertyValue("FrameURL") >>= m_sInitialFrameURL;
++
+     SvxShape::Create( pNewObj, pNewPage );
+     const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID );
+     createObject(aIFrameClassId);
+diff --git a/sw/inc/ndole.hxx b/sw/inc/ndole.hxx
+index 302c9a0a5ebe..15e79f691e64 100644
+--- a/sw/inc/ndole.hxx
++++ b/sw/inc/ndole.hxx
+@@ -28,7 +28,7 @@ class SwGrfFormatColl;
+ class SwDoc;
+ class SwOLENode;
+ class SwOLEListener_Impl;
+-class SwEmbedObjectLink;
++namespace sfx2 { class SvBaseLink; }
+ class DeflateData;
+ 
+ class SW_DLLPUBLIC SwOLEObj
+@@ -93,7 +93,7 @@ class SW_DLLPUBLIC SwOLENode final: public SwNoTextNode
+     bool   mbOLESizeInvalid; /**< Should be considered at SwDoc::PrtOLENotify
+                                    (e.g. copied). Is not persistent. */
+ 
+-    SwEmbedObjectLink*  mpObjectLink;
++    sfx2::SvBaseLink*  mpObjectLink;
+     OUString maLinkURL;
+ 
+     SwOLENode(  const SwNodeIndex &rWhere,
+diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx
+index d7dd08bb969a..8e2a1f9a46b9 100644
+--- a/sw/source/core/ole/ndole.cxx
++++ b/sw/source/core/ole/ndole.cxx
+@@ -149,6 +149,8 @@ void SAL_CALL SwOLEListener_Impl::disposing( const lang::EventObject& )
+ // TODO/LATER: actually SwEmbedObjectLink should be used here, but because different objects are used to control
+ //             embedded object different link objects with the same functionality had to be implemented
+ 
++namespace {
++
+ class SwEmbedObjectLink : public sfx2::SvBaseLink
+ {
+     SwOLENode* m_pOleNode;
+@@ -211,6 +213,44 @@ void SwEmbedObjectLink::Closed()
+     SvBaseLink::Closed();
+ }
+ 
++class SwIFrameLink : public sfx2::SvBaseLink
++{
++    SwOLENode* m_pOleNode;
++
++public:
++    explicit SwIFrameLink(SwOLENode* pNode)
++        : ::sfx2::SvBaseLink(::SfxLinkUpdateMode::ONCALL, SotClipboardFormatId::SVXB)
++        , m_pOleNode(pNode)
++    {
++        SetSynchron( false );
++    }
++
++    ::sfx2::SvBaseLink::UpdateResult DataChanged(
++        const OUString&, const uno::Any& )
++    {
++        uno::Reference<embed::XEmbeddedObject> xObject = m_pOleNode->GetOLEObj().GetOleRef();
++        uno::Reference<embed::XCommonEmbedPersist> xPersObj(xObject, uno::UNO_QUERY);
++        if (xPersObj.is())
++        {
++            // let the IFrameObject reload the link
++            try
++            {
++                xPersObj->reload(uno::Sequence<beans::PropertyValue>(), uno::Sequence<beans::PropertyValue>());
++            }
++            catch (const uno::Exception&)
++            {
++            }
++
++            m_pOleNode->SetChanged();
++        }
++
++        return SUCCESS;
++    }
++
++};
++
++}
++
+ SwOLENode::SwOLENode( const SwNodeIndex &rWhere,
+                     const svt::EmbeddedObjectRef& xObj,
+                     SwGrfFormatColl *pGrfColl,
+@@ -609,18 +649,49 @@ void SwOLENode::CheckFileLink_Impl()
+ 
+     try
+     {
+-        uno::Reference< embed::XLinkageSupport > xLinkSupport( maOLEObj.m_xOLERef.GetObject(), uno::UNO_QUERY_THROW );
+-        if ( xLinkSupport->isLink() )
++        uno::Reference<embed::XEmbeddedObject> xObject = maOLEObj.m_xOLERef.GetObject();
++        if (!xObject)
++            return;
++
++        bool bIFrame = false;
++
++        OUString aLinkURL;
++        uno::Reference<embed::XLinkageSupport> xLinkSupport(xObject, uno::UNO_QUERY);
++        if (xLinkSupport)
++        {
++            if (xLinkSupport->isLink())
++                aLinkURL = xLinkSupport->getLinkURL();
++        }
++        else
++        {
++            // get IFrame (Floating Frames) listed and updatable from the
++            // manage links dialog
++            SvGlobalName aClassId(xObject->getClassID());
++            if (aClassId == SvGlobalName(SO3_IFRAME_CLASSID))
++            {
++                uno::Reference<beans::XPropertySet> xSet(xObject->getComponent(), uno::UNO_QUERY);
++                if (xSet.is())
++                    xSet->getPropertyValue("FrameURL") >>= aLinkURL;
++                bIFrame = true;
++            }
++        }
++
++        if (!aLinkURL.isEmpty()) // this is a file link so the model link manager should handle it
+         {
+-            const OUString aLinkURL = xLinkSupport->getLinkURL();
+-            if ( !aLinkURL.isEmpty() )
++            SwEmbedObjectLink* pEmbedObjectLink = nullptr;
++            if (!bIFrame)
++            {
++                pEmbedObjectLink = new SwEmbedObjectLink(this);
++                mpObjectLink = pEmbedObjectLink;
++            }
++            else
+             {
+-                // this is a file link so the model link manager should handle it
+-                mpObjectLink = new SwEmbedObjectLink( this );
+-                maLinkURL = aLinkURL;
+-                GetDoc().getIDocumentLinksAdministration().GetLinkManager().InsertFileLink( *mpObjectLink, sfx2::SvBaseLinkObjectType::ClientOle, aLinkURL );
+-                mpObjectLink->Connect();
++                mpObjectLink = new SwIFrameLink(this);
+             }
++            maLinkURL = aLinkURL;
++            GetDoc().getIDocumentLinksAdministration().GetLinkManager().InsertFileLink( *mpObjectLink, sfx2::SvBaseLinkObjectType::ClientOle, aLinkURL );
++            if (pEmbedObjectLink)
++                pEmbedObjectLink->Connect();
+         }
+     }
+     catch( uno::Exception& )
+diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
+index 8827cc83e446..02fef6949c31 100644
+--- a/xmloff/source/draw/ximpshap.cxx
++++ b/xmloff/source/draw/ximpshap.cxx
+@@ -3127,10 +3127,36 @@ SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
+ {
+ }
+ 
++uno::Reference<drawing::XShape> SdXMLFloatingFrameShapeContext::CreateFloatingFrameShape() const
++{
++    uno::Reference<lang::XMultiServiceFactory> xServiceFact(GetImport().GetModel(), uno::UNO_QUERY);
++    if (!xServiceFact.is())
++        return nullptr;
++    uno::Reference<drawing::XShape> xShape(
++            xServiceFact->createInstance("com.sun.star.drawing.FrameShape"), uno::UNO_QUERY);
++    return xShape;
++}
++
+ void SdXMLFloatingFrameShapeContext::startFastElement (sal_Int32 /*nElement*/,
+     const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/)
+ {
+-    AddShape("com.sun.star.drawing.FrameShape");
++    uno::Reference<drawing::XShape> xShape(SdXMLFloatingFrameShapeContext::CreateFloatingFrameShape());
++
++    uno::Reference< beans::XPropertySet > xProps(xShape, uno::UNO_QUERY);
++    // set FrameURL before AddShape, we have to do it again later because it
++    // gets cleared when the SdrOle2Obj is attached to the XShape.  But we want
++    // FrameURL to exist when AddShape triggers SetPersistName which itself
++    // triggers SdrOle2Obj::CheckFileLink_Impl and at that point we want to
++    // know what URL will end up being used. So bodge this by setting FrameURL
++    // to the temp pre-SdrOle2Obj attached properties and we can smuggle it
++    // eventually into SdrOle2Obj::SetPersistName at the right point after
++    // PersistName is set but before SdrOle2Obj::CheckFileLink_Impl is called
++    // in order to inform the link manager that this is an IFrame that links to
++    // a URL
++    if (xProps && !maHref.isEmpty())
++        xProps->setPropertyValue("FrameURL", Any(maHref));
++
++    AddShape(xShape);
+ 
+     if( !mxShape.is() )
+         return;
+@@ -3140,7 +3166,6 @@ void SdXMLFloatingFrameShapeContext::startFastElement (sal_Int32 /*nElement*/,
+     // set pos, size, shear and rotate
+     SetTransformation();
+ 
+-    uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
+     if( xProps.is() )
+     {
+         if( !maFrameName.isEmpty() )
+diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
+index 202de49d7bc9..e11f1688e79b 100644
+--- a/xmloff/source/draw/ximpshap.hxx
++++ b/xmloff/source/draw/ximpshap.hxx
+@@ -528,6 +528,8 @@ private:
+     OUString maFrameName;
+     OUString maHref;
+ 
++    css::uno::Reference<css::drawing::XShape> CreateFloatingFrameShape() const;
++
+ public:
+ 
+     SdXMLFloatingFrameShapeContext( SvXMLImport& rImport,
diff -Nru libreoffice-7.4.5/debian/patches/sc-stack-parameter-count.diff libreoffice-7.4.5/debian/patches/sc-stack-parameter-count.diff
--- libreoffice-7.4.5/debian/patches/sc-stack-parameter-count.diff	1970-01-01 01:00:00.000000000 +0100
+++ libreoffice-7.4.5/debian/patches/sc-stack-parameter-count.diff	2023-05-22 18:00:21.000000000 +0200
@@ -0,0 +1,225 @@
+From 48ce354351d58f4a63c45d0c56156ff1268bd050 Mon Sep 17 00:00:00 2001
+From: Eike Rathke <erack@redhat.com>
+Date: Thu, 16 Feb 2023 20:20:31 +0100
+Subject: [PATCH] Obtain actual 0-parameter count for OR(), AND() and
+ 1-parameter functions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+OR and AND for legacy infix notation are classified as binary
+operators but in fact are functions with parameter count. In case
+no argument is supplied, GetByte() returns 0 and for that case the
+implicit binary operator 2 parameters were wrongly assumed.
+Similar for functions expecting 1 parameter, without argument 1
+was assumed. For "real" unary and binary operators the compiler
+already checks parameters. Omit OR and AND and 1-parameter
+functions from this implicit assumption and return the actual 0
+count.
+
+Change-Id: Ie05398c112a98021ac2875cf7b6de994aee9d882
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147173
+Reviewed-by: Eike Rathke <erack@redhat.com>
+Tested-by: Jenkins
+(cherry picked from commit e7ce9bddadb2db222eaa5f594ef1de2e36d57e5c)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147129
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit d6599a2af131994487d2d9223a4fd32a8c3ddc49)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147132
+Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
+Tested-by: Caolán McNamara <caolanm@redhat.com>
+---
+ formula/source/core/api/token.cxx | 13 +++++--------
+ sc/source/core/tool/interpr4.cxx  | 10 +++++++++-
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+From 48ce354351d58f4a63c45d0c56156ff1268bd050 Mon Sep 17 00:00:00 2001
+From: Eike Rathke <erack@redhat.com>
+Date: Thu, 16 Feb 2023 20:20:31 +0100
+Subject: [PATCH] Obtain actual 0-parameter count for OR(), AND() and
+ 1-parameter functions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+OR and AND for legacy infix notation are classified as binary
+operators but in fact are functions with parameter count. In case
+no argument is supplied, GetByte() returns 0 and for that case the
+implicit binary operator 2 parameters were wrongly assumed.
+Similar for functions expecting 1 parameter, without argument 1
+was assumed. For "real" unary and binary operators the compiler
+already checks parameters. Omit OR and AND and 1-parameter
+functions from this implicit assumption and return the actual 0
+count.
+
+Change-Id: Ie05398c112a98021ac2875cf7b6de994aee9d882
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147173
+Reviewed-by: Eike Rathke <erack@redhat.com>
+Tested-by: Jenkins
+(cherry picked from commit e7ce9bddadb2db222eaa5f594ef1de2e36d57e5c)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147129
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+(cherry picked from commit d6599a2af131994487d2d9223a4fd32a8c3ddc49)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147132
+Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
+Tested-by: Caolán McNamara <caolanm@redhat.com>
+---
+ formula/source/core/api/token.cxx | 13 +++++--------
+ sc/source/core/tool/interpr4.cxx  | 10 +++++++++-
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+From ef9af49e1060bfb2a15db81ba10703ebd520bbf6 Mon Sep 17 00:00:00 2001
+From: Eike Rathke <erack@redhat.com>
+Date: Mon, 27 Feb 2023 16:10:06 +0100
+Subject: [PATCH] Always push a result, even if it's only an error
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+PERCENTILE() and QUARTILE() if an error was passed as argument (or
+an error encountered during obtaining arguments) omitted to push
+an error result, only setting the error.
+
+Fallout from
+
+    commit f336f63da900d76c2bf6e5690f1c8a7bd15a0aa2
+    CommitDate: Thu Mar 3 16:28:59 2016 +0000
+
+        tdf#94635 Add FORECAST.ETS functions to Calc
+
+Change-Id: I23e276fb0ce735cfd6383cc963446499dcf819f4
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147922
+Reviewed-by: Eike Rathke <erack@redhat.com>
+Tested-by: Jenkins
+(cherry picked from commit 64914560e279c71ff1233f4bab851e2a292797e6)
+Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147901
+Reviewed-by: Caolán McNamara <caolanm@redhat.com>
+Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
+Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
+Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
+---
+ sc/source/core/tool/interpr3.cxx | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
+index 9a22d9cd2205..f194a4f74926 100644
+--- a/formula/source/core/api/token.cxx
++++ b/formula/source/core/api/token.cxx
+@@ -93,17 +93,14 @@ sal_uInt8 FormulaToken::GetParamCount() const
+         return 0;       // parameters and specials
+                         // ocIf... jump commands not for FAP, have cByte then
+ //2do: bool parameter whether FAP or not?
+-    else if ( GetByte() )
++    else if (GetByte())
+         return GetByte();   // all functions, also ocExternal and ocMacro
+-    else if (SC_OPCODE_START_BIN_OP <= eOp && eOp < SC_OPCODE_STOP_BIN_OP)
+-        return 2;           // binary
+-    else if ((SC_OPCODE_START_UN_OP <= eOp && eOp < SC_OPCODE_STOP_UN_OP)
+-            || eOp == ocPercentSign)
+-        return 1;           // unary
++    else if (SC_OPCODE_START_BIN_OP <= eOp && eOp < SC_OPCODE_STOP_BIN_OP && eOp != ocAnd && eOp != ocOr)
++        return 2;           // binary operators, compiler checked; OR and AND legacy but are functions
++    else if ((SC_OPCODE_START_UN_OP <= eOp && eOp < SC_OPCODE_STOP_UN_OP) || eOp == ocPercentSign)
++        return 1;           // unary operators, compiler checked
+     else if (SC_OPCODE_START_NO_PAR <= eOp && eOp < SC_OPCODE_STOP_NO_PAR)
+         return 0;           // no parameter
+-    else if (SC_OPCODE_START_1_PAR <= eOp && eOp < SC_OPCODE_STOP_1_PAR)
+-        return 1;           // one parameter
+     else if (FormulaCompiler::IsOpCodeJumpCommand( eOp ))
+         return 1;           // only the condition counts as parameter
+     else
+diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
+index 30e79d9272bb..c1fc5f458dcb 100644
+--- a/sc/source/core/inc/interpre.hxx
++++ b/sc/source/core/inc/interpre.hxx
+@@ -221,6 +221,7 @@ private:
+     inline bool MustHaveParamCount( short nAct, short nMust );
+     inline bool MustHaveParamCount( short nAct, short nMust, short nMax );
+     inline bool MustHaveParamCountMin( short nAct, short nMin );
++    inline bool MustHaveParamCountMinWithStackCheck( short nAct, short nMin );
+     void PushParameterExpected();
+     void PushIllegalParameter();
+     void PushIllegalArgument();
+@@ -1074,6 +1075,17 @@ inline bool ScInterpreter::MustHaveParamCountMin( short nAct, short nMin )
+     return false;
+ }
+ 
++inline bool ScInterpreter::MustHaveParamCountMinWithStackCheck( short nAct, short nMin )
++{
++    assert(sp >= nAct);
++    if (sp < nAct)
++    {
++        PushParameterExpected();
++        return false;
++    }
++    return MustHaveParamCountMin( nAct, nMin);
++}
++
+ inline bool ScInterpreter::CheckStringPositionArgument( double & fVal )
+ {
+     if (!std::isfinite( fVal))
+diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
+index e09620605d35..eb77bf07e514 100644
+--- a/sc/source/core/tool/interpr1.cxx
++++ b/sc/source/core/tool/interpr1.cxx
+@@ -7628,7 +7628,7 @@ void ScInterpreter::ScVLookup()
+ void ScInterpreter::ScSubTotal()
+ {
+     sal_uInt8 nParamCount = GetByte();
+-    if ( !MustHaveParamCountMin( nParamCount, 2 ) )
++    if ( !MustHaveParamCountMinWithStackCheck( nParamCount, 2 ) )
+         return;
+ 
+     // We must fish the 1st parameter deep from the stack! And push it on top.
+@@ -7675,7 +7675,7 @@ void ScInterpreter::ScSubTotal()
+ void ScInterpreter::ScAggregate()
+ {
+     sal_uInt8 nParamCount = GetByte();
+-    if ( !MustHaveParamCountMin( nParamCount, 3 ) )
++    if ( !MustHaveParamCountMinWithStackCheck( nParamCount, 3 ) )
+         return;
+ 
+     const FormulaError nErr = nGlobalError;
+diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx
+index c0ac25b257e5..77c767f88286 100644
+--- a/sc/source/core/tool/interpr3.cxx
++++ b/sc/source/core/tool/interpr3.cxx
+@@ -3465,7 +3465,7 @@ void ScInterpreter::ScPercentile( bool bInclusive )
+     GetNumberSequenceArray( 1, aArray, false );
+     if ( aArray.empty() || nGlobalError != FormulaError::NONE )
+     {
+-        SetError( FormulaError::NoValue );
++        PushNoValue();
+         return;
+     }
+     if ( bInclusive )
+@@ -3488,7 +3488,7 @@ void ScInterpreter::ScQuartile( bool bInclusive )
+     GetNumberSequenceArray( 1, aArray, false );
+     if ( aArray.empty() || nGlobalError != FormulaError::NONE )
+     {
+-        SetError( FormulaError::NoValue );
++        PushNoValue();
+         return;
+     }
+     if ( bInclusive )
+diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
+index 0895c75b5cc9..120aea5d3e97 100644
+--- a/sc/source/core/tool/interpr4.cxx
++++ b/sc/source/core/tool/interpr4.cxx
+@@ -4034,7 +4034,15 @@ StackVar ScInterpreter::Interpret()
+                 else if (sp >= pCur->GetParamCount())
+                     nStackBase = sp - pCur->GetParamCount();
+                 else
+-                    nStackBase = sp;    // underflow?!?
++                {
++                    SAL_WARN("sc.core", "Stack anomaly at " << aPos.Format(
++                                ScRefFlags::VALID | ScRefFlags::FORCE_DOC | ScRefFlags::TAB_3D, &mrDoc)
++                            << "  eOp: " << static_cast<int>(eOp)
++                            << "  params: " << static_cast<int>(pCur->GetParamCount())
++                            << "  nStackBase: " << nStackBase << "  sp: " << sp);
++                    nStackBase = sp;
++                    assert(!"underflow");
++                }
+             }
+ 
+             switch( eOp )
diff -Nru libreoffice-7.4.5/debian/patches/series libreoffice-7.4.5/debian/patches/series
--- libreoffice-7.4.5/debian/patches/series	2023-01-26 21:43:44.000000000 +0100
+++ libreoffice-7.4.5/debian/patches/series	2023-05-22 18:00:21.000000000 +0200
@@ -51,3 +51,5 @@
 fix-system-libfixmath.diff
 boost-1.81.diff
 0004-Remove-dependency-on-BitArray.h-from-zxing-1.2.0.patch
+CVE-2023-2255.diff
+sc-stack-parameter-count.diff
diff -Nru libreoffice-7.4.5/debian/rules libreoffice-7.4.5/debian/rules
--- libreoffice-7.4.5/debian/rules	2023-02-02 21:38:41.000000000 +0100
+++ libreoffice-7.4.5/debian/rules	2023-05-22 18:00:45.000000000 +0200
@@ -2300,7 +2300,7 @@
 		unset DISPLAY; \
 		unset CONNECTIVITY_TEST_MYSQL_DRIVER; \
 		export PARALLELISM=1; \
-		if [ -x /usr/bin/gdb ]; then ulimit -c unlimited; fi && \
+		if [ -x /usr/bin/gdb ]; then ulimit -c unlimited || true; fi && \
 		$(TEST_TIMEOUT) $(MAKE) -k check || $(TEST_TIMEOUT) $(MAKE) check && \
 	rm -rf $$t
 endif
diff -Nru libreoffice-7.4.5/debian/tests/cppunit-connectivity-mysql libreoffice-7.4.5/debian/tests/cppunit-connectivity-mysql
--- libreoffice-7.4.5/debian/tests/cppunit-connectivity-mysql	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/cppunit-connectivity-mysql	2023-05-22 18:00:45.000000000 +0200
@@ -46,7 +46,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo "====== Resetting $db_user password ======"
 $db_safe_command --skip-grant-tables &
diff -Nru libreoffice-7.4.5/debian/tests/cppunit-subsequentcheck libreoffice-7.4.5/debian/tests/cppunit-subsequentcheck
--- libreoffice-7.4.5/debian/tests/cppunit-subsequentcheck	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/cppunit-subsequentcheck	2023-05-22 18:00:45.000000000 +0200
@@ -30,7 +30,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Starting subsequentcheck with ${CHECK_PARALLELISM} job ======"
diff -Nru libreoffice-7.4.5/debian/tests/junit-subsequentcheck libreoffice-7.4.5/debian/tests/junit-subsequentcheck
--- libreoffice-7.4.5/debian/tests/junit-subsequentcheck	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/junit-subsequentcheck	2023-05-22 18:00:45.000000000 +0200
@@ -45,7 +45,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 OOO_TEST_SOFFICE="${1:-path:/usr/lib/libreoffice/program/soffice}"
 
diff -Nru libreoffice-7.4.5/debian/tests/slowcheck libreoffice-7.4.5/debian/tests/slowcheck
--- libreoffice-7.4.5/debian/tests/slowcheck	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/slowcheck	2023-05-22 18:00:45.000000000 +0200
@@ -30,7 +30,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Starting slowcheck with ${CHECK_PARALLELISM} job ======"
diff -Nru libreoffice-7.4.5/debian/tests/smoketest libreoffice-7.4.5/debian/tests/smoketest
--- libreoffice-7.4.5/debian/tests/smoketest	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/smoketest	2023-05-22 18:00:45.000000000 +0200
@@ -36,7 +36,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 OOO_TEST_SOFFICE="${1:-path:/usr/lib/libreoffice/program/soffice}"
 
diff -Nru libreoffice-7.4.5/debian/tests/testtools-bridgetest libreoffice-7.4.5/debian/tests/testtools-bridgetest
--- libreoffice-7.4.5/debian/tests/testtools-bridgetest	2022-08-07 18:20:58.000000000 +0200
+++ libreoffice-7.4.5/debian/tests/testtools-bridgetest	2023-05-22 18:00:45.000000000 +0200
@@ -32,7 +32,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 if [ ! -f config_host.mk ]; then
 	# this normally shouldn't be needed but otherwise it wants a automatic
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-cui libreoffice-7.4.5/debian/tests/uicheck-cui
--- libreoffice-7.4.5/debian/tests/uicheck-cui	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-cui	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-sc libreoffice-7.4.5/debian/tests/uicheck-sc
--- libreoffice-7.4.5/debian/tests/uicheck-sc	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-sc	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-sd libreoffice-7.4.5/debian/tests/uicheck-sd
--- libreoffice-7.4.5/debian/tests/uicheck-sd	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-sd	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-sfx2 libreoffice-7.4.5/debian/tests/uicheck-sfx2
--- libreoffice-7.4.5/debian/tests/uicheck-sfx2	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-sfx2	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-svx libreoffice-7.4.5/debian/tests/uicheck-svx
--- libreoffice-7.4.5/debian/tests/uicheck-svx	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-svx	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-sw libreoffice-7.4.5/debian/tests/uicheck-sw
--- libreoffice-7.4.5/debian/tests/uicheck-sw	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-sw	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-uitest libreoffice-7.4.5/debian/tests/uicheck-uitest
--- libreoffice-7.4.5/debian/tests/uicheck-uitest	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-uitest	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/uicheck-writerperfect libreoffice-7.4.5/debian/tests/uicheck-writerperfect
--- libreoffice-7.4.5/debian/tests/uicheck-writerperfect	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/uicheck-writerperfect	2023-05-22 18:00:45.000000000 +0200
@@ -38,7 +38,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Generating en_US.UTF-8 locale ======"
diff -Nru libreoffice-7.4.5/debian/tests/unitcheck libreoffice-7.4.5/debian/tests/unitcheck
--- libreoffice-7.4.5/debian/tests/unitcheck	2022-01-21 21:09:23.000000000 +0100
+++ libreoffice-7.4.5/debian/tests/unitcheck	2023-05-22 18:00:45.000000000 +0200
@@ -36,7 +36,7 @@
 echo
 echo "====== Enabling core dumps ======"
 # yes, we want core dumps and stack traces
-ulimit -c unlimited
+ulimit -c unlimited || true
 
 echo
 echo "====== Starting unitcheck with ${CHECK_PARALLELISM} job ======"

Reply to: