Merge pull request #2137 from reaperhulk/encode-rfc822name

Encode rfc822name
diff --git a/.travis.yml b/.travis.yml
index 8ad514f..b8206e0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -120,7 +120,7 @@
     - ./.travis/run.sh
 
 after_success:
-    - source ~/.venv/bin/activate && bash <(curl -s https://codecov.io/bash) -e TRAVIS_OS_NAME,TOXENV,OPENSSL
+    - ./.travis/upload_coverage.sh
 
 notifications:
     irc:
diff --git a/.travis/upload_coverage.sh b/.travis/upload_coverage.sh
new file mode 100755
index 0000000..554116f
--- /dev/null
+++ b/.travis/upload_coverage.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+set -x
+
+NO_COVERAGE_TOXENVS=(pypy pypy3 pep8 py3pep8 docs)
+if ! [[ "${NO_COVERAGE_TOXENVS[*]}" =~ "${TOXENV}" ]]; then
+    source ~/.venv/bin/activate
+    bash <(curl -s https://codecov.io/bash) -e TRAVIS_OS_NAME,TOXENV,OPENSSL
+fi
diff --git a/src/cryptography/hazmat/backends/openssl/backend.py b/src/cryptography/hazmat/backends/openssl/backend.py
index 266a847..bba407d 100644
--- a/src/cryptography/hazmat/backends/openssl/backend.py
+++ b/src/cryptography/hazmat/backends/openssl/backend.py
@@ -216,6 +216,7 @@
                 backend._ffi.NULL, data_ptr_ptr, len(alt_name.value)
             )
             if value == backend._ffi.NULL:
+                backend._consume_errors()
                 raise ValueError("Invalid ASN.1 data")
             other_name.type_id = type_id
             other_name.value = value
diff --git a/src/cryptography/hazmat/backends/openssl/x509.py b/src/cryptography/hazmat/backends/openssl/x509.py
index 096cbc9..472d8a7 100644
--- a/src/cryptography/hazmat/backends/openssl/x509.py
+++ b/src/cryptography/hazmat/backends/openssl/x509.py
@@ -175,10 +175,9 @@
         data = _asn1_string_to_ascii(backend, gn.d.rfc822Name)
         name, address = parseaddr(data)
         parts = address.split(u"@")
-        if name or len(parts) > 2 or not address:
-            # parseaddr has found a name (e.g. Name <email>) or the split
-            # has found more than 2 parts (which means more than one @ sign)
-            # or the entire value is an empty string.
+        if name or not address:
+            # parseaddr has found a name (e.g. Name <email>) or the entire
+            # value is an empty string.
             raise ValueError("Invalid rfc822name value")
         elif len(parts) == 1:
             # Single label email name. This is valid for local delivery. No
diff --git a/src/cryptography/hazmat/bindings/openssl/binding.py b/src/cryptography/hazmat/bindings/openssl/binding.py
index b7178bb..86fac5c 100644
--- a/src/cryptography/hazmat/bindings/openssl/binding.py
+++ b/src/cryptography/hazmat/bindings/openssl/binding.py
@@ -72,9 +72,6 @@
 
     @classmethod
     def _ensure_ffi_initialized(cls):
-        if cls._lib_loaded:
-            return
-
         with cls._init_lock:
             if not cls._lib_loaded:
                 cls._lib_loaded = True