office-gobmx/sdext
Michael Stahl 2cb54449b4 sdext: fix use-after-free on global AccessibleFocusManager
The problem is that the destructor of the vector maFocusableObjects
ends up dispose()-ing every element, which calls back into
AccessibleFocusManager to remove the element from the vector, which
invokes its destructor a 2nd time.

Move it to the stack so it doesn't double-free itself.

ERROR: AddressSanitizer: heap-use-after-free on address 0x612001571c00 at pc 0x7fc5e723ca72 bp 0x7fffbaa8d6d0 sp 0x7fffbaa8d6c8
READ of size 1 at 0x612001571c00 thread T0
    #0 0x7fc5e723ca71 in cppu::WeakComponentImplHelperBase::release() cppuhelper/source/implbase.cxx:84:9
    #1 0x7fc595211b27 in cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::awt::XWindowListener>::release() include/cppuhelper/compbase.hxx:86:36
    #2 0x7fc5952093e4 in rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject>::~Reference() include/rtl/ref.hxx:113:22
    #3 0x7fc59522acd4 in void std::_Destroy<rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject> >(rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject>*) /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/stl_construct.h:140:19

0x612001571c00 is located 64 bytes inside of 312-byte region [0x612001571bc0,0x612001571cf8)
freed by thread T0 here:
    #0 0x4be997 in free (instdir/program/soffice.bin+0x4be997)
    #1 0x7fc5ea2a5104 in rtl_freeMemory sal/rtl/alloc_global.cxx:51:5
    #2 0x7fc5952097f4 in cppu::WeakComponentImplHelperBase::operator delete(void*) include/cppuhelper/compbase_ex.hxx:66:11
    #3 0x7fc595211e07 in sdext::presenter::PresenterAccessible::AccessibleObject::~AccessibleObject() sdext/source/presenter/PresenterAccessibility.cxx:67:28
    #4 0x7fc5e74a11b4 in cppu::OWeakObject::release() cppuhelper/source/weak.cxx:233:9
    #5 0x7fc5e723cb05 in cppu::WeakComponentImplHelperBase::release() cppuhelper/source/implbase.cxx:86:18
    #6 0x7fc595211b27 in cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::awt::XWindowListener>::release() include/cppuhelper/compbase.hxx:86:36
    #7 0x7fc5e7194115 in com::sun::uno::Reference<com::sun::uno::XInterface>::~Reference() include/com/sun/star/uno/Reference.hxx:110:22
    #8 0x7fc5e71f3944 in com::sun::lang::EventObject::~EventObject() workdir/UnoApiHeadersTarget/udkapi/comprehensive/com/sun/star/lang/EventObject.hdl:18:27
    #9 0x7fc5e723d395 in cppu::WeakComponentImplHelperBase::dispose() cppuhelper/source/implbase.cxx:118:5
    #10 0x7fc595211e27 in cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::awt::XWindowListener>::dispose() include/cppuhelper/compbase.hxx:90:36
    #11 0x7fc5e723c6e9 in cppu::WeakComponentImplHelperBase::release() cppuhelper/source/implbase.cxx:79:13
    #12 0x7fc595211b27 in cppu::PartialWeakComponentImplHelper<com::sun::accessibility::XAccessible, com::sun::accessibility::XAccessibleContext, com::sun::accessibility::XAccessibleComponent, com::sun::accessibility::XAccessibleEventBroadcaster, com::sun::awt::XWindowListener>::release() include/cppuhelper/compbase.hxx:86:36
    #13 0x7fc5952093e4 in rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject>::~Reference() include/rtl/ref.hxx:113:22
    #14 0x7fc59522acd4 in void std::_Destroy<rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject> >(rtl::Reference<sdext::presenter::PresenterAccessible::AccessibleObject>*) /usr/bin/../lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/stl_construct.h:140:19

Change-Id: I95151807e9182ed5f43b63792fba86f83ee0bad8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104208
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
2020-10-13 10:46:46 +02:00
..
inc
source sdext: fix use-after-free on global AccessibleFocusManager 2020-10-13 10:46:46 +02:00
CppunitTest_sdext_pdfimport.mk
CustomTarget_pdfimport.mk
Executable_pdf2xml.mk
Executable_pdfunzip.mk
Executable_xpdfimport.mk
IwyuFilter_sdext.yaml
Library_pdfimport.mk
Library_PresentationMinimizer.mk
Library_PresenterScreen.mk
Makefile
Module_sdext.mk
Package_pdfimport_xpdfimport.mk
README

Extensions for the Impress and Draw applications.

source/pdfimport/ - PDF import

	Uses an external poppler process to parse and handle PDF
	import as draw shapes.

source/minimizer/ - Presentation Minimizer

	Shrinks presentations by down-scaling images, and removing
	extraneous eg. embedded OLE content.

source/presenter/ - Impress / Presenter Console.

	This couples to sd/ in rather strange ways. Its design is
	heavily mangled by an attempt to use only UNO interfaces
	which are highly inadequate. This leads to somewhat
	ridiculous situations. Activating in response to
	configuration keys (for example), and the 'XPresenterHelper'
	interface inside sd/ used to create and manage windows.

    The main screen uses a hardware-accelerated
    canvas (e.g. cairo canvas), while the entire secondary screen
    uses a VCL-canvas that is created in
    sd::framework::FullScreenPane::CreateCanvas().

    The secondary screen contains 3 "Panes" which each have
    2 XWindows for the border area & the actual content,
    and each content Pane is backed by a sd::presenter::PresenterCanvas
    that wraps the FullScreenPane's canvas and does clipping.