QWebEngineCertificateError::defer() segfaults

Phil Thompson phil at riverbankcomputing.com
Tue Apr 26 12:33:46 BST 2022


On 22/04/2022 10:21, Florian Bruhin wrote:
> Hi,
> 
> The attached examples use QWebEngineCertificateError::defer() (added in
> Qt 5.14) to accept/reject certificates asynchronously:
> 
> https://doc.qt.io/qt-5/qwebenginecertificateerror.html#defer
> https://doc.qt.io/qt-6/qwebenginecertificateerror.html#defer
> 
> With PySide6, this seems to work properly: The page pauses loading, and
> after 1s, it gets shown.
> 
> With PyQt6 and PyQt5 (and PySide2), it segfaults.
> 
> PyQt5:
> 
>     Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
>     QWebEngineCertificateError::ignoreCertificateError
> (this=0x7fffffffb3f0) at
> /usr/src/debug/qtwebengine/src/webenginewidgets/api/qwebenginecertificateerror.cpp:231
>     231	   d->ignoreCertificateError();
>     (gdb) bt
>     #0  QWebEngineCertificateError::ignoreCertificateError()
> (this=0x7fffffffb3f0) at
> /usr/src/debug/qtwebengine/src/webenginewidgets/api/qwebenginecertificateerror.cpp:231
>     #1  0x00007ffff726fc63 in
> meth_QWebEngineCertificateError_ignoreCertificateError(PyObject*,
> PyObject*) (sipSelf=<optimized out>, sipArgs=<optimized out>)
>         at
> /usr/src/debug/PyQtWebEngine-5.15.5/build/QtWebEngineWidgets/sipQtWebEngineWidgetsQWebEngineCertificateError.cpp:236
>     [...]
>     #4  0x00007fffdb53ed31 in PyQtSlot::call(_object*, _object*) const
> (this=0x5555566debe0, args=0x7ffff7490070, callable=0x7fff805b4270) at
> ../../qpy/QtCore/qpycore_pyqtslot.cpp:247
>     [...]
>     #11 0x00007ffff62343d4 in QSingleShotTimer::timeout()
> (this=0x5555560691d0) at .moc/qtimer.moc:130
> 
> PyQt6 (strangely I seem to be missing some debugging symbols):
> 
>     #0  0x00007fffecca9050 in
> QtWebEngineCore::CertificateErrorController::answered() const () at
> /usr/lib/libQt6WebEngineCore.so.6
>     #1  0x00007fffecca9075 in
> QtWebEngineCore::CertificateErrorController::accept(bool) () at
> /usr/lib/libQt6WebEngineCore.so.6
>     [...]
>     #4  0x00007ffff7d1d83b in PyObject_Call () at 
> /usr/lib/libpython3.10.so.1.0
>     [...]
>     #9  0x00007fffeb4dc676 in QObject::event(QEvent*) () at
> /usr/lib/libQt6Core.so.60

The issue seems to be the deletion of C++ objects when the event loop is 
running waiting for the timeout to occur.

The following at the start of the handlers seems to fix it...

err = QWebEngineCertificateError(err)

...but I don't know if that is the "correct solution" or just a 
workaround.

Phil


More information about the PyQt mailing list