@@ -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 );
@@ -1521,25 +1509,30 @@ _ssl__SSLSocket_peer_certificate_impl(PySSLSocket *self, int binary_mode)
1521
1509
/*[clinic end generated code: output=f0dc3e4d1d818a1d input=8281bd1d193db843]*/
1522
1510
{
1523
1511
int verification ;
1512
+ X509 * peer_cert ;
1513
+ PyObject * result ;
1524
1514
1525
- if (!self -> handshake_done ) {
1515
+ if (!SSL_is_init_finished ( self -> ssl ) ) {
1526
1516
PyErr_SetString (PyExc_ValueError ,
1527
1517
"handshake not done yet" );
1528
1518
return NULL ;
1529
1519
}
1530
- if (!self -> peer_cert )
1520
+ peer_cert = SSL_get_peer_certificate (self -> ssl );
1521
+ if (peer_cert == NULL )
1531
1522
Py_RETURN_NONE ;
1532
1523
1533
1524
if (binary_mode ) {
1534
1525
/* return cert in DER-encoded format */
1535
- return _certificate_to_der (self -> peer_cert );
1526
+ result = _certificate_to_der (peer_cert );
1536
1527
} else {
1537
1528
verification = SSL_CTX_get_verify_mode (SSL_get_SSL_CTX (self -> ssl ));
1538
1529
if ((verification & SSL_VERIFY_PEER ) == 0 )
1539
- return PyDict_New ();
1530
+ result = PyDict_New ();
1540
1531
else
1541
- return _decode_certificate (self -> peer_cert );
1532
+ result = _decode_certificate (peer_cert );
1542
1533
}
1534
+ X509_free (peer_cert );
1535
+ return result ;
1543
1536
}
1544
1537
1545
1538
static PyObject *
@@ -1860,8 +1853,6 @@ Passed as \"self\" in servername callback.");
1860
1853
1861
1854
static void PySSL_dealloc (PySSLSocket * self )
1862
1855
{
1863
- if (self -> peer_cert ) /* Possible not to have one? */
1864
- X509_free (self -> peer_cert );
1865
1856
if (self -> ssl )
1866
1857
SSL_free (self -> ssl );
1867
1858
Py_XDECREF (self -> Socket );
@@ -2457,7 +2448,7 @@ static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2457
2448
"Cannot set session for server-side SSLSocket." );
2458
2449
return -1 ;
2459
2450
}
2460
- if (self -> handshake_done ) {
2451
+ if (SSL_is_init_finished ( self -> ssl ) ) {
2461
2452
PyErr_SetString (PyExc_ValueError ,
2462
2453
"Cannot set session after handshake." );
2463
2454
return -1 ;
0 commit comments