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