◐ Shell
reader mode source ↗
Skip to content

bpo-22559: Implementation of the PEP 546: Backport MemoryBIO#2133

Closed
vstinner wants to merge 9 commits into
python:2.7from
vstinner:memorybio27
Closed

bpo-22559: Implementation of the PEP 546: Backport MemoryBIO#2133
vstinner wants to merge 9 commits into
python:2.7from
vstinner:memorybio27

Conversation

@vstinner

@vstinner vstinner commented Jun 12, 2017

Copy link
Copy Markdown
Member

Implementation of the PEP 546: backport ssl.MemoryBIO and ssl.SSLObject from master to the 2.7 branch.

Co-Authored-By: Alex Gaynor alex.gaynor@gmail.com

http://bugs.python.org/issue22559

https://bugs.python.org/issue22559

@vstinner

Copy link
Copy Markdown
Member Author

cc @Lukasa

@alex alex left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hide comment

It's been a while since I looked at this patch, but from an initial glance it looks like what I expected.

@alex

alex commented Jun 20, 2017

Copy link
Copy Markdown
Member

Tests appear to be hanging; these suck to debug. Usually there's a hidden exception coming from one of the non-main threads.

vstinner and others added 3 commits July 5, 2017 11:00
Implementation of the PEP 546: backport ssl.MemoryBIO and
ssl.SSLObject from master to the 2.7 branch.

Co-Authored-By: Alex Gaynor <alex.gaynor@gmail.com>
@vstinner vstinner changed the title [WIP] bpo-22559: Backport MemoryBIO Jul 5, 2017
@vstinner

vstinner commented Jul 5, 2017

Copy link
Copy Markdown
Member Author

I rebased my change and addressed @alex and my comments. I removed [WIP] from the PR title, it's now ready for a real review :-)

@alex

alex commented Jul 5, 2017

Copy link
Copy Markdown
Member

Tests still appear to be hanging, so that's going to be a blocker, I'll review for everything else.

@alex alex left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hide comment

Patch looks fine (and largely the same as my original one!). If you'd like help tracking down the hang in test_ssl, let me know.

@alex

alex commented Jul 20, 2017

Copy link
Copy Markdown
Member

Sigh, it took quite a while, but the answer is that svn.python.org doesn't behave the exact way these tests expect. There's a reason we ported all the rest of the tests away from it :-(

Switching to REMOTE_HOST fixes test_read_write_data, but it looks like test_handshake is really only happy with the in-memoryserver that the py3k versions of these tests use.

Here's the diff I used to do all this testing:

diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 4e34734662..c99db781c1 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -1757,17 +1757,17 @@ class NetworkedBIOTests(unittest.TestCase):
         return ret
 
     def test_handshake(self):
-        with support.transient_internet("svn.python.org"):
+        with support.transient_internet(REMOTE_HOST):
             sock = socket.socket(socket.AF_INET)
-            sock.connect(("svn.python.org", 443))
+            sock.connect((REMOTE_HOST, 443))
             incoming = ssl.MemoryBIO()
             outgoing = ssl.MemoryBIO()
             ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
             ctx.verify_mode = ssl.CERT_REQUIRED
-            ctx.load_verify_locations(SVN_PYTHON_ORG_ROOT_CERT)
+            ctx.load_verify_locations(REMOTE_ROOT_CERT)
             if ssl.HAS_SNI:
                 ctx.check_hostname = True
-                sslobj = ctx.wrap_bio(incoming, outgoing, False, 'svn.python.org')
+                sslobj = ctx.wrap_bio(incoming, outgoing, False, REMOTE_HOST)
             else:
                 ctx.check_hostname = False
                 sslobj = ctx.wrap_bio(incoming, outgoing, False)
@@ -1786,9 +1786,9 @@ class NetworkedBIOTests(unittest.TestCase):
             sock.close()
 
     def test_read_write_data(self):
-        with support.transient_internet("svn.python.org"):
+        with support.transient_internet(REMOTE_HOST):
             sock = socket.socket(socket.AF_INET)
-            sock.connect(("svn.python.org", 443))
+            sock.connect((REMOTE_HOST, 443))
             incoming = ssl.MemoryBIO()
             outgoing = ssl.MemoryBIO()
             ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)

@vstinner

Copy link
Copy Markdown
Member Author

@alex: I'm unable to reproduce the failure on my Fedora 25, so I tried your patch to see if it's going better on the CI.

@alex

alex commented Jul 21, 2017

Copy link
Copy Markdown
Member

FWIW, I had no problem reproducing on macOS. What version of OpenSSL does Fedora 25 use?

@vstinner

Copy link
Copy Markdown
Member Author

Fedora 25 uses OpenSSL 1.0.2k.

@vstinner vstinner changed the title bpo-22559: Backport MemoryBIO Aug 11, 2017
@tiran

tiran commented Sep 8, 2017

Copy link
Copy Markdown
Member

You have to use BIO_up_ref() instead of CRYPTO_add. 3.6 has:

diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 8202fd0262..defb50ed4a 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -171,6 +171,12 @@ static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
     return x->data.x509;
 }
 
+static int BIO_up_ref(BIO *b)
+{
+    CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
+    return 1;
+}
+
 static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
     return store->objs;
 }
@@ -599,8 +605,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
         /* BIOs are reference counted and SSL_set_bio borrows our reference.
          * To prevent a double free in memory_bio_dealloc() we need to take an
          * extra reference here. */
-        CRYPTO_add(&inbio->bio->references, 1, CRYPTO_LOCK_BIO);
-        CRYPTO_add(&outbio->bio->references, 1, CRYPTO_LOCK_BIO);
+        BIO_up_ref(inbio->bio);
+        BIO_up_ref(outbio->bio);
         SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
     }
     mode = SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;

@vstinner

vstinner commented Sep 8, 2017

Copy link
Copy Markdown
Member Author

Sadly, MemoryBIO will have to wait for Python 2.7.15 which has no schedule yet :-(

@tiran

tiran commented Sep 8, 2017

Copy link
Copy Markdown
Member

The backport has a bug. sslobj.unwrap call in NetworkedBIOTests.test_handshake blocks indefinitely. The test is only executed with -u network resource enabled..

@vstinner

vstinner commented Sep 8, 2017

Copy link
Copy Markdown
Member Author
./python -m test -v -u all -m test_handshake test_ssl

This command loops on the "SSLSyscallError: Some I/O error occurred (_ssl.c:2097)" error while running SSLObject.unwrap(): "self.ssl_io_loop(sock, incoming, outgoing, sslobj.unwrap)".

@vstinner vstinner closed this Feb 1, 2018
@vstinner vstinner deleted the memorybio27 branch May 29, 2018 22:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants