winaccessibility/source/UAccCOM/MAccessible.cxx |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

New commits:
commit a3773ad48a87fdbe3543e8005483e913068498b9
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Mon Feb 10 17:17:39 2025 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Feb 11 16:15:49 2025 +0100

    tdf#153131 wina11y: Return error code when child count exceeds max long
    
    When the accessible child count exceeds max long,
    no longer return max long in the IAccessible::get_accChildCount [1]
    implementation in the Windows a11y bridge, but instead return error
    code `S_FALSE` [2]:
    
    > The method succeeded in part. This happens when the method succeeds, but
    > the requested information is not available. For example, Microsoft
    > Active Accessibility returns S_FALSE if you call IAccessible::accHitTest
    > to retrieve a child object at a given point, and the specified point is
    > not within the object or the object's child.
    
    This prevents the problem that Windows Speech Recognition on Windows 10
    (see tdf#153131) and apparently some tools on Windows 11 that query
    information from LO via the accessibility API (see tdf#165131 and
    tickets referenced from there) apparently try to iterate over all
    children from child index 0 to (excluding) the returned index
    unconditionally, which causes a freeze if the returned number is too large.
    
    In practice, this is known to be a problem with Calc sheets, for which
    all cells are currently considered direct children.
    
    A quick test with NVDA and this change in place didn't reveal any
    issues.
    (Independent of this change, using JAWS 2025.2412.50 instantly
    results in a crash somewhere in the AT code that gets run
    in-process, preventing to test what implications this change
    would have there otherwise.)
    
    [1] 
https://learn.microsoft.com/en-us/windows/win32/api/oleacc/nf-oleacc-iaccessible-get_accchildcount
    [2] https://learn.microsoft.com/en-us/windows/win32/winauto/return-values
    
    Change-Id: If12dbcbb387a765bec4194d2bfe61bd29aa0f8a7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181370
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    (cherry picked from commit 9ee01d58771b8ea585698094019b1a4dd38e54eb)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181379
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/winaccessibility/source/UAccCOM/MAccessible.cxx 
b/winaccessibility/source/UAccCOM/MAccessible.cxx
index fb13e7e6878a..a6454f3c39f8 100644
--- a/winaccessibility/source/UAccCOM/MAccessible.cxx
+++ b/winaccessibility/source/UAccCOM/MAccessible.cxx
@@ -299,9 +299,13 @@ COM_DECLSPEC_NOTHROW STDMETHODIMP 
CMAccessible::get_accChildCount(long *pcountCh
             sal_Int64 nChildCount = pRContext->getAccessibleChildCount();
             if (nChildCount > std::numeric_limits<long>::max())
             {
-                SAL_WARN("iacc2", "CMAccessible::get_accChildCount: Child 
count exceeds maximum long value, "
-                                  "returning max long.");
-                nChildCount = std::numeric_limits<long>::max();
+                // return error code if child count exceeds max long value
+                // (for Calc sheets which report all cells as children);
+                // tdf#153131: Windows Speech Recognition and apparently some 
other
+                // tools quering information via the a11y API seem to query 
all children unconditionally,
+                // so returning a large number (like 
std::numeric_limits<long>::max) would cause a freeze
+                SAL_WARN("iacc2", "CMAccessible::get_accChildCount: Child 
count exceeds maximum long value");
+                return S_FALSE;
             }
 
             *pcountChildren = nChildCount;

Reply via email to