@@ -316,6 +316,10 @@ enum py_proto_version {
316316#define PySSL_CB_MAXLEN 128
317317
318318
319+ #if OPENSSL_VERSION_NUMBER >= 0x10101000L && !(defined(MS_WINDOWS ) && defined(Py_DEBUG ))
320+ # define PY_HAS_KEYLOG 1
321+ #endif
322+
319323typedef struct {
320324 PyObject_HEAD
321325 SSL_CTX * ctx ;
@@ -328,8 +332,10 @@ typedef struct {
328332 int post_handshake_auth ;
329333#endif
330334 PyObject * msg_cb ;
335+ #ifdef PY_HAS_KEYLOG
331336 PyObject * keylog_filename ;
332337 BIO * keylog_bio ;
338+ #endif
333339 /* Cached module state, also used in SSLSocket and SSLSession code. */
334340 _sslmodulestate * state ;
335341#ifndef OPENSSL_NO_PSK
@@ -355,7 +361,7 @@ typedef struct {
355361 PyObject_HEAD
356362 PyObject * Socket ; /* weakref to socket on which we're layered */
357363 SSL * ssl ;
358- PySSLContext * ctx ; /* weakref to SSL context */
364+ PySSLContext * ctx ; /* SSL context */
359365 char shutdown_seen_zero ;
360366 enum py_ssl_server_or_client socket_type ;
361367 PyObject * owner ; /* Python level "owner" passed to servername callback */
@@ -2343,7 +2349,8 @@ static int
23432349_ssl__SSLSocket_context_set_impl (PySSLSocket * self , PyObject * value )
23442350/*[clinic end generated code: output=6b0a6cc5cf33d9fe input=f7fc1674b660df96]*/
23452351{
2346- if (PyObject_TypeCheck (value , self -> ctx -> state -> PySSLContext_Type )) {
2352+ _sslmodulestate * state = get_state_obj (self );
2353+ if (PyObject_TypeCheck (value , state -> PySSLContext_Type )) {
23472354 Py_SETREF (self -> ctx , (PySSLContext * )Py_NewRef (value ));
23482355 SSL_set_SSL_CTX (self -> ssl , self -> ctx -> ctx );
23492356 /* Set SSL* internal msg_callback to state of new context's state */
@@ -3487,8 +3494,10 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
34873494 self -> ctx = ctx ;
34883495 self -> protocol = proto_version ;
34893496 self -> msg_cb = NULL ;
3497+ #ifdef PY_HAS_KEYLOG
34903498 self -> keylog_filename = NULL ;
34913499 self -> keylog_bio = NULL ;
3500+ #endif
34923501 self -> alpn_protocols = NULL ;
34933502 self -> set_sni_cb = NULL ;
34943503 self -> state = get_ssl_state (module );
@@ -3599,7 +3608,9 @@ context_traverse(PyObject *op, visitproc visit, void *arg)
35993608 PySSLContext * self = PySSLContext_CAST (op );
36003609 Py_VISIT (self -> set_sni_cb );
36013610 Py_VISIT (self -> msg_cb );
3611+ #ifdef PY_HAS_KEYLOG
36023612 Py_VISIT (self -> keylog_filename );
3613+ #endif
36033614#ifndef OPENSSL_NO_PSK
36043615 Py_VISIT (self -> psk_client_callback );
36053616 Py_VISIT (self -> psk_server_callback );
@@ -3614,18 +3625,22 @@ context_clear(PyObject *op)
36143625 PySSLContext * self = PySSLContext_CAST (op );
36153626 Py_CLEAR (self -> set_sni_cb );
36163627 Py_CLEAR (self -> msg_cb );
3628+ #ifdef PY_HAS_KEYLOG
36173629 Py_CLEAR (self -> keylog_filename );
3630+ #endif
36183631#ifndef OPENSSL_NO_PSK
36193632 Py_CLEAR (self -> psk_client_callback );
36203633 Py_CLEAR (self -> psk_server_callback );
36213634#endif
3635+ #ifdef PY_HAS_KEYLOG
36223636 if (self -> keylog_bio != NULL ) {
36233637 Py_BEGIN_ALLOW_THREADS
36243638 BIO_free_all (self -> keylog_bio );
36253639 Py_END_ALLOW_THREADS
36263640 _PySSL_FIX_ERRNO ;
36273641 self -> keylog_bio = NULL ;
36283642 }
3643+ #endif
36293644 return 0 ;
36303645}
36313646
@@ -5680,8 +5695,10 @@ static PyGetSetDef context_getsetlist[] = {
56805695 _SSL__SSLCONTEXT__HOST_FLAGS_GETSETDEF
56815696 _SSL__SSLCONTEXT_MINIMUM_VERSION_GETSETDEF
56825697 _SSL__SSLCONTEXT_MAXIMUM_VERSION_GETSETDEF
5698+ #ifdef PY_HAS_KEYLOG
56835699 {"keylog_filename" , _PySSLContext_get_keylog_filename ,
56845700 _PySSLContext_set_keylog_filename , NULL },
5701+ #endif
56855702 {"_msg_callback" , _PySSLContext_get_msg_callback ,
56865703 _PySSLContext_set_msg_callback , NULL },
56875704 _SSL__SSLCONTEXT_SNI_CALLBACK_GETSETDEF
@@ -6009,8 +6026,23 @@ PySSLSession_richcompare(PyObject *left, PyObject *right, int op)
60096026 return NULL ;
60106027 }
60116028
6029+ PySSLSession * left_sess = PySSLSession_CAST (left );
6030+ PySSLSession * right_sess = PySSLSession_CAST (right );
6031+
6032+ if (left_sess -> ctx == NULL || right_sess -> ctx == NULL ) {
6033+ if (op == Py_EQ ) {
6034+ if (left == right ) Py_RETURN_TRUE ;
6035+ Py_RETURN_FALSE ;
6036+ }
6037+ if (op == Py_NE ) {
6038+ if (left != right ) Py_RETURN_TRUE ;
6039+ Py_RETURN_FALSE ;
6040+ }
6041+ Py_RETURN_NOTIMPLEMENTED ;
6042+ }
6043+
60126044 int result ;
6013- PyTypeObject * sesstype = PySSLSession_CAST ( left ) -> ctx -> state -> PySSLSession_Type ;
6045+ PyTypeObject * sesstype = left_sess -> ctx -> state -> PySSLSession_Type ;
60146046
60156047 if (!Py_IS_TYPE (left , sesstype ) || !Py_IS_TYPE (right , sesstype )) {
60166048 Py_RETURN_NOTIMPLEMENTED ;
0 commit comments