@@ -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,12 +593,10 @@ 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
self -> shutdown_seen_zero = 0 ;
603
- self -> handshake_done = 0 ;
604
600
self -> owner = NULL ;
605
601
self -> server_hostname = NULL ;
606
602
if (server_hostname != NULL ) {
@@ -748,13 +744,6 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
748
744
if (ret < 1 )
749
745
return PySSL_SetError (self , ret , __FILE__ , __LINE__ );
750
746
751
- if (self -> peer_cert )
752
- X509_free (self -> peer_cert );
753
- PySSL_BEGIN_ALLOW_THREADS
754
- self -> peer_cert = SSL_get_peer_certificate (self -> ssl );
755
- PySSL_END_ALLOW_THREADS
756
- self -> handshake_done = 1 ;
757
-
758
747
Py_RETURN_NONE ;
759
748
760
749
error :
@@ -1506,25 +1495,30 @@ _ssl__SSLSocket_peer_certificate_impl(PySSLSocket *self, int binary_mode)
1506
1495
/*[clinic end generated code: output=f0dc3e4d1d818a1d input=8281bd1d193db843]*/
1507
1496
{
1508
1497
int verification ;
1498
+ X509 * peer_cert ;
1499
+ PyObject * result ;
1509
1500
1510
- if (!self -> handshake_done ) {
1501
+ if (!SSL_is_init_finished ( self -> ssl ) ) {
1511
1502
PyErr_SetString (PyExc_ValueError ,
1512
1503
"handshake not done yet" );
1513
1504
return NULL ;
1514
1505
}
1515
- if (!self -> peer_cert )
1506
+ peer_cert = SSL_get_peer_certificate (self -> ssl );
1507
+ if (peer_cert == NULL )
1516
1508
Py_RETURN_NONE ;
1517
1509
1518
1510
if (binary_mode ) {
1519
1511
/* return cert in DER-encoded format */
1520
- return _certificate_to_der (self -> peer_cert );
1512
+ result = _certificate_to_der (peer_cert );
1521
1513
} else {
1522
1514
verification = SSL_CTX_get_verify_mode (SSL_get_SSL_CTX (self -> ssl ));
1523
1515
if ((verification & SSL_VERIFY_PEER ) == 0 )
1524
- return PyDict_New ();
1516
+ result = PyDict_New ();
1525
1517
else
1526
- return _decode_certificate (self -> peer_cert );
1518
+ result = _decode_certificate (peer_cert );
1527
1519
}
1520
+ X509_free (peer_cert );
1521
+ return result ;
1528
1522
}
1529
1523
1530
1524
static PyObject *
@@ -1845,8 +1839,6 @@ Passed as \"self\" in servername callback.");
1845
1839
1846
1840
static void PySSL_dealloc (PySSLSocket * self )
1847
1841
{
1848
- if (self -> peer_cert ) /* Possible not to have one? */
1849
- X509_free (self -> peer_cert );
1850
1842
if (self -> ssl )
1851
1843
SSL_free (self -> ssl );
1852
1844
Py_XDECREF (self -> Socket );
@@ -2442,7 +2434,7 @@ static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2442
2434
"Cannot set session for server-side SSLSocket." );
2443
2435
return -1 ;
2444
2436
}
2445
- if (self -> handshake_done ) {
2437
+ if (SSL_is_init_finished ( self -> ssl ) ) {
2446
2438
PyErr_SetString (PyExc_ValueError ,
2447
2439
"Cannot set session after handshake." );
2448
2440
return -1 ;
0 commit comments