This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/openoffice.git


The following commit(s) were added to refs/heads/trunk by this push:
     new db81dcd785 Fix scratch buffer overflow in FreeBSD aarch64 bridge 
Follow-up to stack alignment fix: guard against types larger than 8 bytes by 
copying directly to stack instead of using scratch buffer.
db81dcd785 is described below

commit db81dcd785344765c11249e7639a5317cc58bb57
Author: Pedro Giffuni <[email protected]>
AuthorDate: Thu Oct 22 00:40:22 2026 -0500

    Fix scratch buffer overflow in FreeBSD aarch64 bridge
    Follow-up to stack alignment fix: guard against types larger than 8
    bytes by copying directly to stack instead of using scratch buffer.
---
 .../cpp_uno/gcc3_freebsd_aarch64/uno2cpp.cxx       | 59 +++++++++++++---------
 1 file changed, 34 insertions(+), 25 deletions(-)

diff --git a/main/bridges/source/cpp_uno/gcc3_freebsd_aarch64/uno2cpp.cxx 
b/main/bridges/source/cpp_uno/gcc3_freebsd_aarch64/uno2cpp.cxx
index 30dbd72000..eb1a3cfe1b 100644
--- a/main/bridges/source/cpp_uno/gcc3_freebsd_aarch64/uno2cpp.cxx
+++ b/main/bridges/source/cpp_uno/gcc3_freebsd_aarch64/uno2cpp.cxx
@@ -362,46 +362,55 @@ static void cpp_call(
                        // (sal_uInt64) scratch slot; reuse them with a local 
counter.
                        nStack = aarch64::align_stack_offset( nStack, 
rParam.pTypeRef );
                        sal_uInt32 size = aarch64::stack_size( rParam.pTypeRef 
);
-                       sal_uInt64 scratch[1] = {0};
-                       int tempNr = 0;
-                       switch (pParamTypeDescr->eTypeClass)
+                       if ( size > 8 )
+                       {
+                           // Larger types are copied raw (no extension 
needed).
+                           memcpy( pStackStart + nStack, pCppArgs[nPos], 
pParamTypeDescr->nSize );
+                           nStack += size;
+                       }
+                       else
                        {
+                           sal_uInt64 scratch[1] = {0};
+                           int tempNr = 0;
+                           switch (pParamTypeDescr->eTypeClass)
+                           {
                                case typelib_TypeClass_FLOAT:
-                                       INSERT_FLOAT( pCppArgs[nPos], tempNr, 
reinterpret_cast<double *>(scratch) );
-                                       break;
+                                   INSERT_FLOAT( pCppArgs[nPos], tempNr, 
reinterpret_cast<double *>(scratch) );
+                                   break;
                                case typelib_TypeClass_DOUBLE:
-                                       INSERT_DOUBLE( pCppArgs[nPos], tempNr, 
reinterpret_cast<double *>(scratch) );
-                                       break;
+                                   INSERT_DOUBLE( pCppArgs[nPos], tempNr, 
reinterpret_cast<double *>(scratch) );
+                                   break;
                                case typelib_TypeClass_HYPER:
                                case typelib_TypeClass_UNSIGNED_HYPER:
-                                       INSERT_INT64( pCppArgs[nPos], tempNr, 
scratch );
-                                       break;
+                                   INSERT_INT64( pCppArgs[nPos], tempNr, 
scratch );
+                                   break;
                                case typelib_TypeClass_LONG:
-                                       INSERT_SIGNED_INT32( pCppArgs[nPos], 
tempNr, scratch );
-                                       break;
+                                   INSERT_SIGNED_INT32( pCppArgs[nPos], 
tempNr, scratch );
+                                   break;
                                case typelib_TypeClass_UNSIGNED_LONG:
                                case typelib_TypeClass_ENUM:
-                                       INSERT_INT32( pCppArgs[nPos], tempNr, 
scratch );
-                                       break;
+                                   INSERT_INT32( pCppArgs[nPos], tempNr, 
scratch );
+                                   break;
                                case typelib_TypeClass_SHORT:
-                                       INSERT_SIGNED_INT16( pCppArgs[nPos], 
tempNr, scratch );
-                                       break;
+                                   INSERT_SIGNED_INT16( pCppArgs[nPos], 
tempNr, scratch );
+                                   break;
                                case typelib_TypeClass_CHAR:
                                case typelib_TypeClass_UNSIGNED_SHORT:
-                                       INSERT_INT16( pCppArgs[nPos], tempNr, 
scratch );
-                                       break;
+                                   INSERT_INT16( pCppArgs[nPos], tempNr, 
scratch );
+                                   break;
                                case typelib_TypeClass_BYTE:
-                                       INSERT_SIGNED_INT8( pCppArgs[nPos], 
tempNr, scratch );
-                                       break;
+                                   INSERT_SIGNED_INT8( pCppArgs[nPos], tempNr, 
scratch );
+                                   break;
                                case typelib_TypeClass_BOOLEAN:
-                                       INSERT_INT8( pCppArgs[nPos], tempNr, 
scratch );
-                                       break;
+                                   INSERT_INT8( pCppArgs[nPos], tempNr, 
scratch );
+                                   break;
                                default:
-                                       memcpy( scratch, pCppArgs[nPos], 
pParamTypeDescr->nSize );
-                                       break;
+                                   memcpy( scratch, pCppArgs[nPos], 
pParamTypeDescr->nSize );
+                                   break;
+                           }
+                           memcpy( pStackStart + nStack, scratch, size );
+                           nStack += size;
                        }
-                       memcpy( pStackStart + nStack, scratch, size );
-                               nStack += size;
                        }
 
                        TYPELIB_DANGER_RELEASE( pParamTypeDescr );

Reply via email to