Convert to getattro some more; also swap PyBytes_AsString for _PyUnicode_AsString when we know the input is unicode, not bytes
diff --git a/OpenSSL/crypto/x509.c b/OpenSSL/crypto/x509.c
index 915a3b7..73f5e08 100644
--- a/OpenSSL/crypto/x509.c
+++ b/OpenSSL/crypto/x509.c
@@ -93,8 +93,6 @@
     long small_serial;
     PyObject *serial = NULL;
     PyObject *hex = NULL;
-    PyObject *format = NULL;
-    PyObject *format_args = NULL;
     ASN1_INTEGER *asn1_i = NULL;
     BIGNUM *bignum = NULL;
 
@@ -117,12 +115,8 @@
      * it.  If bignum is still NULL after this call, then the return value
      * is actually the result.  I hope.  -exarkun
      */
-    small_serial = BN_hex2bn(&bignum, PyBytes_AsString(hex));
+    small_serial = BN_hex2bn(&bignum, _PyUnicode_AsString(hex));
 
-    Py_DECREF(format_args);
-    format_args = NULL;
-    Py_DECREF(format);
-    format = NULL;
     Py_DECREF(hex);
     hex = NULL;
 
@@ -151,12 +145,6 @@
     return Py_None;
 
   err:
-    if (format_args) {
-        Py_DECREF(format_args);
-    }
-    if (format) {
-        Py_DECREF(format);
-    }
     if (hex) {
         Py_DECREF(hex);
     }
diff --git a/OpenSSL/crypto/x509name.c b/OpenSSL/crypto/x509name.c
index c288180..83f3c21 100644
--- a/OpenSSL/crypto/x509name.c
+++ b/OpenSSL/crypto/x509name.c
@@ -148,10 +148,11 @@
  *            wrong
  */
 static PyObject *
-crypto_X509Name_getattr(crypto_X509NameObj *self, char *name)
+crypto_X509Name_getattro(crypto_X509NameObj *self, PyObject *nameobj)
 {
     int nid, len;
     char *utf8string;
+    char *name = _PyUnicode_AsString(nameobj);
 
     if ((nid = OBJ_txt2nid(name)) == NID_undef) {
         /*
@@ -162,7 +163,7 @@
          * See lp#314814.
          */
         flush_error_queue();
-        return crypto_X509Name_Type.tp_getattr((PyObject*)self, name);
+        return PyObject_GenericGetAttr((PyObject*)self, nameobj);
     }
 
     len = get_name_by_nid(self->x509_name, nid, &utf8string);
@@ -461,7 +462,7 @@
     0,
     (destructor)crypto_X509Name_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_X509Name_getattr,
+    NULL, /* getattr */
     (setattrfunc)crypto_X509Name_setattr,
     NULL, /* reserved */
     (reprfunc)crypto_X509Name_repr,
@@ -471,7 +472,7 @@
     NULL, /* hash */
     NULL, /* call */
     NULL, /* str */
-    NULL, /* getattro */
+    (getattrofunc)crypto_X509Name_getattro, /* getattro */
     NULL, /* setattro */
     NULL, /* as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
diff --git a/OpenSSL/ssl/context.c b/OpenSSL/ssl/context.c
index bfd8ffe..902d1e4 100644
--- a/OpenSSL/ssl/context.c
+++ b/OpenSSL/ssl/context.c
@@ -368,8 +368,8 @@
         Py_DECREF(type);
         return NULL;
     }
-    right_name = (PyString_CheckExact(name_attr) &&
-                  strcmp(name, PyString_AsString(name_attr)) == 0);
+    right_name = (PyUnicode_CheckExact(name_attr) &&
+                  strcmp(name, _PyUnicode_AsString(name_attr)) == 0);
     Py_DECREF(name_attr);
     res = (PyTypeObject *)type;
     if (!right_name || res->tp_basicsize != objsize) {