@@ -298,9 +298,7 @@ typedef struct {
298
298
PyObject * Socket ; /* weakref to socket on which we're layered */
299
299
SSL * ssl ;
300
300
PySSLContext * ctx ; /* weakref to SSL context */
301
- X509 * peer_cert ;
302
301
char shutdown_seen_zero ;
303
- char handshake_done ;
304
302
enum py_ssl_server_or_client socket_type ;
305
303
PyObject * owner ; /* Python level "owner" passed to servername callback */
306
304
PyObject * server_hostname ;
@@ -595,13 +593,11 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
595
593
if (self == NULL )
596
594
return NULL ;
597
595
598
- self -> peer_cert = NULL ;
599
596
self -> ssl = NULL ;
600
597
self -> Socket = NULL ;
601
598
self -> ctx = sslctx ;
602
599
Py_INCREF (sslctx );
603
600
self -> shutdown_seen_zero = 0 ;
604
- self -> handshake_done = 0 ;
605
601
self -> owner = NULL ;
606
602
self -> server_hostname = NULL ;
607
603
if (server_hostname != NULL ) {
@@ -747,15 +743,7 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
747
743
if (ret < 1 )
748
744
return PySSL_SetError (self , ret , __FILE__ , __LINE__ );
749
745
750
- if (self -> peer_cert )
751
- X509_free (self -> peer_cert );
752
- PySSL_BEGIN_ALLOW_THREADS
753
- self -> peer_cert = SSL_get_peer_certificate (self -> ssl );
754
- PySSL_END_ALLOW_THREADS
755
- self -> handshake_done = 1 ;
756
-
757
- Py_INCREF (Py_None );
758
- return Py_None ;
746
+ Py_RETURN_NONE ;
759
747
760
748
error :
761
749
Py_XDECREF (sock );
@@ -1506,25 +1494,30 @@ _ssl__SSLSocket_peer_certificate_impl(PySSLSocket *self, int binary_mode)
1506
1494
/*[clinic end generated code: output=f0dc3e4d1d818a1d input=8281bd1d193db843]*/
1507
1495
{
1508
1496
int verification ;
1497
+ X509 * peer_cert ;
1498
+ PyObject * result ;
1509
1499
1510
- if (!self -> handshake_done ) {
1500
+ if (!SSL_is_init_finished ( self -> ssl ) ) {
1511
1501
PyErr_SetString (PyExc_ValueError ,
1512
1502
"handshake not done yet" );
1513
1503
return NULL ;
1514
1504
}
1515
- if (!self -> peer_cert )
1505
+ peer_cert = SSL_get_peer_certificate (self -> ssl );
1506
+ if (peer_cert == NULL )
1516
1507
Py_RETURN_NONE ;
1517
1508
1518
1509
if (binary_mode ) {
1519
1510
/* return cert in DER-encoded format */
1520
- return _certificate_to_der (self -> peer_cert );
1511
+ result = _certificate_to_der (peer_cert );
1521
1512
} else {
1522
1513
verification = SSL_CTX_get_verify_mode (SSL_get_SSL_CTX (self -> ssl ));
1523
1514
if ((verification & SSL_VERIFY_PEER ) == 0 )
1524
- return PyDict_New ();
1515
+ result = PyDict_New ();
1525
1516
else
1526
- return _decode_certificate (self -> peer_cert );
1517
+ result = _decode_certificate (peer_cert );
1527
1518
}
1519
+ X509_free (peer_cert );
1520
+ return result ;
1528
1521
}
1529
1522
1530
1523
static PyObject *
@@ -1845,8 +1838,6 @@ Passed as \"self\" in servername callback.");
1845
1838
1846
1839
static void PySSL_dealloc (PySSLSocket * self )
1847
1840
{
1848
- if (self -> peer_cert ) /* Possible not to have one? */
1849
- X509_free (self -> peer_cert );
1850
1841
if (self -> ssl )
1851
1842
SSL_free (self -> ssl );
1852
1843
Py_XDECREF (self -> Socket );
@@ -2442,7 +2433,7 @@ static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2442
2433
"Cannot set session for server-side SSLSocket." );
2443
2434
return -1 ;
2444
2435
}
2445
- if (self -> handshake_done ) {
2436
+ if (SSL_is_init_finished ( self -> ssl ) ) {
2446
2437
PyErr_SetString (PyExc_ValueError ,
2447
2438
"Cannot set session after handshake." );
2448
2439
return -1 ;
0 commit comments