On Fri Jun 17, 2022 at 10:06:01AM +0200, Theo Buehler wrote:
> The patch below is a hack that makes qgis build on aarch64.  It's
> not the correct fix.
> 
> What happens is that the destructor of the QWaitCondition class is
> called more than once.

IMHO The issue is the python code or in other words where it is used.

> The second time it is called from Python's atexit
> handler crashes due to a use-after-free in pthread_cond_destroy().
> 
> The patch below simply avoids this.  The correct fix would have to root
> cause why this happens on aarch64 and not on amd64.

There is no issue in Qt5 or QWaitCondition itself. I'm fine with the
patch but please add a comment and a referent to qgis / x11/py-qt5
please.

Thanks Rafael

> 
> The backtrace looks something like this:
> 
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  pthread_cond_destroy (condp=0x8) at 
> /usr/src/lib/libc/thread/rthread_cond.c:54
> 54              cond = *condp;
> (gdb) bt
> #0  pthread_cond_destroy (condp=0x8) at 
> /usr/src/lib/libc/thread/rthread_cond.c:54
> #1  0x00000017eee75c94 in QWaitCondition::~QWaitCondition() ()
>    from /usr/local/lib/qt5/libQt5Core.so.3.0
> #2  0x000000187be1cbf0 in _libc___cxa_finalize (dso=0x0) at 
> /usr/src/lib/libc/stdlib/atexit.c:177
> #3  0x000000187be04f60 in _libc_exit (status=0) at 
> /usr/src/lib/libc/stdlib/exit.c:54
> #4  0x000000184b7b79cc in Py_Exit () from /usr/local/lib/libpython3.9.so.0.0
> #5  0x000000184b7bd0d0 in _PyErr_PrintEx () from 
> /usr/local/lib/libpython3.9.so.0.0
> #6  0x000000184b7bbdfc in PyRun_SimpleFileExFlags () from 
> /usr/local/lib/libpython3.9.so.0.0
> #7  0x000000184b7e0bec in Py_RunMain () from 
> /usr/local/lib/libpython3.9.so.0.0
> #8  0x000000184b7e1bdc in pymain_main () from 
> /usr/local/lib/libpython3.9.so.0.0
> #9  0x000000184b7e1ed8 in Py_BytesMain () from 
> /usr/local/lib/libpython3.9.so.0.0
> #10 0x00000013a6600860 in _start ()
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/x11/qt5/qtbase/Makefile,v
> retrieving revision 1.52
> diff -u -p -r1.52 Makefile
> --- Makefile  11 Mar 2022 20:16:59 -0000      1.52
> +++ Makefile  17 Jun 2022 07:47:27 -0000
> @@ -7,7 +7,7 @@ COMMENT-mysql =               MySQL plugin for Qt5
>  COMMENT-psql =               PostgresSQL plugin for Qt5
>  COMMENT-tds =                TDS plugin for Qt5
>  
> -REVISION-main =              9
> +REVISION-main =              10
>  REVISION-examples =  0
>  
>  PKGNAME-mysql =              qt5-mysql-${VERSION}
> Index: patches/patch-src_corelib_thread_qwaitcondition_unix_cpp
> ===================================================================
> RCS file: patches/patch-src_corelib_thread_qwaitcondition_unix_cpp
> diff -N patches/patch-src_corelib_thread_qwaitcondition_unix_cpp
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-src_corelib_thread_qwaitcondition_unix_cpp  17 Jun 2022 
> 06:46:24 -0000
> @@ -0,0 +1,16 @@
> +Index: src/corelib/thread/qwaitcondition_unix.cpp
> +--- src/corelib/thread/qwaitcondition_unix.cpp.orig
> ++++ src/corelib/thread/qwaitcondition_unix.cpp
> +@@ -181,9 +181,12 @@ QWaitCondition::QWaitCondition()
> + 
> + QWaitCondition::~QWaitCondition()
> + {
> ++    if (d == nullptr)
> ++        return;
> +     report_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv 
> destroy");
> +     report_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex 
> destroy");
> +     delete d;
> ++    d = nullptr;
> + }
> + 
> + void QWaitCondition::wakeOne()
> 

Reply via email to