forked from amazingfate/loongoffice
TableControl::commitCellEventIfAccessibleAlive sends an event
on the currently selected/active cell. So only call it in
SVTXGridControl::ProcessWindowEvent when there is one.
Use TableControl::GetCurrentRow and TableControl::GetCurrentColumn
to check that, which return a special value (of -2) for the case there
is no active cell.
For TableControl::GetCurrentRow:
/** retrieves the current row
The current row is the one which contains the active cell.
@return
the row index of the active cell, or ->ROW_INVALID
if there is no active cell, e.g. because the table does
not contain any rows or columns.
*/
sal_Int32 GetCurrentRow() const override;
The previous check whether the table has any rows was insufficient
and resulted in an invalid attempt to access vector elements at
negative indices.
For the tdf#164783 scenario:
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
In function:
reference
std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
[_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
_Allocator =
std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]
Error: attempt to subscript container with out-of-bounds index -6, but
container only holds 60 elements.
Objects involved in the operation:
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
In function:
reference
std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
[_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
_Allocator =
std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]
Error: attempt to subscript container with out-of-bounds index -6, but
container only holds 60 elements.
Objects involved in the operation:
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
sequence "this" @ 0x5638c74e2350 {
type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
}
Fatal exception: Signal 6
Stack:
#0 sal::backtrace_get(unsigned int) at .../libreoffice/sal/osl/unx/backtraceapi.cxx:42
#1 (anonymous namespace)::printStack(int) at .../libreoffice/sal/osl/unx/signal.cxx:289
#2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:330
#3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:427
#4 /lib/x86_64-linux-gnu/libc.so.6(+0x3fda0) [0x7f7544649da0]
#5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44 (discriminator 1)
#6 raise at ./signal/../sysdeps/posix/raise.c:27
#7 abort at ./stdlib/abort.c:81
#8 std::__throw_bad_exception() in /lib/x86_64-linux-gnu/libstdc++.so.6
#9 std::__debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>>::operator[](unsigned long) at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508
#10 accessibility::AccessibleGridControlTable::getAccessibleChild(long) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:66
#11 accessibility::AccessibleGridControlTable::getAccessibleCellAt(int, int) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:191
#12 accessibility::AccessibleGridControl::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/vcl/source/accessibility/AccessibleGridControl.cxx:272
#13 accessibility::AccessibleGridControlAccess::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/vcl/inc/accessibility/AccessibleGridControl.hxx:197
#14 svt::table::TableControl_Impl::commitCellEvent(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol_impl.cxx:2304
#15 svt::table::TableControl::commitCellEventIfAccessibleAlive(short, com::sun:⭐:uno::Any const&, com::sun:⭐:uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:470
#16 SVTXGridControl::ProcessWindowEvent(VclWindowEvent const&) at .../libreoffice/toolkit/source/controls/svtxgridcontrol.cxx:823
#17 VCLXWindow::WindowEventListener(VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:390
#18 VCLXWindow::LinkStubWindowEventListener(void*, VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:383
#19 Link<VclWindowEvent&, void>::Call(VclWindowEvent&) const at .../libreoffice/include/tools/link.hxx:101
#20 vcl::Window::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/window/event.cxx:262
#21 Control::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/control/ctrl.cxx:298
#22 Control::ImplCallEventListenersAndHandler(VclEventId, std::function<void ()> const&) at .../libreoffice/vcl/source/control/ctrl.cxx:305
#23 Control::EventNotify(NotifyEvent&) at .../libreoffice/vcl/source/control/ctrl.cxx:247
#24 vcl::Window::CompatNotify(NotifyEvent&) at .../libreoffice/vcl/source/window/window.cxx:3943
#25 vcl::Window::LoseFocus() at .../libreoffice/vcl/source/window/window.cxx:1861
#26 svt::table::TableControl::LoseFocus() at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:94
#27 vcl::Window::CompatLoseFocus() at .../libreoffice/vcl/source/window/window.cxx:3912
#28 vcl::Window::ImplAsyncFocusHdl(void*) at .../libreoffice/vcl/source/window/winproc.cxx:2127
#29 vcl::Window::LinkStubImplAsyncFocusHdl(void*, void*) at .../libreoffice/vcl/source/window/winproc.cxx:2033
#30 Link<void*, void>::Call(void*) const at .../libreoffice/include/tools/link.hxx:101
#31 ImplHandleUserEvent(ImplSVEvent*) at .../libreoffice/vcl/source/window/winproc.cxx:2288
#32 ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at .../libreoffice/vcl/source/window/winproc.cxx:2849
#33 SalFrame::CallCallback(SalEvent, void const*) const at .../libreoffice/vcl/inc/salframe.hxx:311
#34 SalGenericDisplay::ProcessEvent(SalUserEventList::SalUserEvent) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:67
#35 SalUserEventList::DispatchUserEvents(bool)::$_0::operator()() const at .../libreoffice/vcl/source/app/salusereventlist.cxx:119
#36 SalUserEventList::DispatchUserEvents(bool) at .../libreoffice/vcl/source/app/salusereventlist.cxx:120
#37 SalGenericDisplay::DispatchInternalEvent(bool) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:51
#38 call_userEventFn(void*) at .../libreoffice/vcl/unx/gtk3/gtkdata.cxx:827
#39 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5a81f) [0x7f7536f0b81f]
#40 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5ca57) [0x7f7536f0da57]
#41 g_main_loop_run in /lib/x86_64-linux-gnu/libglib-2.0.so.0
...
Change-Id: Iafed90e6985cf2c05d65be5f74334f58b369d945
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180661
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
(cherry picked from commit 57906dde339a71eee87437ae2d11c7474c03befd)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180680
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>