Crash using QSslCertificate.subjectAlternateNames?

Phil Thompson phil at riverbankcomputing.com
Sat Dec 11 17:22:33 GMT 2021


On 07/12/2021 23:45, Jeremy Katz wrote:
> Hi,
> 
> I'm seeing a crash calling QSslCertificate.subjectAlternateNames(). It
> takes a few calls to fail, but seems to be consistent for a
> client:server pair.
> 
> Software versions:
> macOS 12 or Fedora 32 and 35, Ubuntu 20.04?
> PyQt 5.15.[4,5,6]
> Qt 5.15.[2,5,7]
> Python 3.[7,10]
> 
> I've been told that it doesn't occur with PyQt and Qt 5.12.
> 
> The Linux stack trace suggests the issue is in PyQt's conversion of
> the returned QMultiMap:
> 
> #0  _PyObject_GC_UNTRACK
> #1  PyObject_GC_UnTrack
> #2  subtype_dealloc
> #3  convertFrom_QMultiMap_0100QSsl_AlternativeNameEntryType_0100QString
> #4  sip_api_convert_from_new_type
> #5  meth_QSslCertificate_subjectAlternativeNames
> ...
> 
> The Mac stack trace isn't as obvious to me:
> 
> * thread #2, queue = 'com.apple.main-thread', stop reason =
> EXC_BAD_ACCESS (code=1, address=0xaa)
>   * frame #0: Python`_PyType_Lookup + 42
>     frame #1: Python`_PyObject_LookupSpecial + 40
>     frame #2: Python`PyObject_Format + 117
>     frame #3: Python`output_markup + 1176
>     frame #4: Python`build_string + 393
>     frame #5: Python`do_string_format + 97
>     frame #6: Python`_PyMethodDef_RawFastCallKeywords + 685
>     frame #7: Python`_PyMethodDescr_FastCallKeywords + 82
>     frame #8: Python`call_function + 780
>     frame #9: Python`_PyEval_EvalFrameDefault + 25155
>     frame #10: Python`function_code_fastcall + 128
>     frame #11: Python`_PyFunction_FastCallDict + 148
>     frame #12: QtCore.abi3.so`PyQtSlot::call(_object*, _object*) const 
> + 39
>     frame #13: QtCore.abi3.so`PyQtSlot::invoke(void**, _object*,
> void*, bool) const + 374
> 
> === Test program ===
> 
> import sys
> 
> import PyQt5.QtCore as QtCore
> import PyQt5.QtNetwork as QtNetwork
> 
> def handleFinished(reply):
>     while True:
>         for cert in reply.sslConfiguration().peerCertificateChain():
>             for k,v in cert.subjectAlternativeNames().items():
>                 print("{}, {}".format(k, v))
> 
> app = QtCore.QCoreApplication(sys.argv)
> url = QtCore.QUrl(sys.argv[1])
> qnam = QtNetwork.QNetworkAccessManager()
> qnam.setAutoDeleteReplies(True)
> qnam.finished.connect(handleFinished)
> request = QtNetwork.QNetworkRequest(url)
> qnam.get(request)
> 
> app.exec()
> 
> === Example output ===
> $ python3 ~/vm_shared/tmp/subjectaltnames.test.py 
> https://www.google.com
> 1, ['www.google.com']
> 1, ['www.google.com']
> 1, ['www.google.com']
> Abort trap: 6

Should be fixed in the next snapshot (PyQt6 as well).

Thanks,
Phil


More information about the PyQt mailing list