@@ -676,49 +676,67 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
676676}
677677
678678static PyObject *
679- _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value ) {
680-
681- char namebuf [X509_NAME_MAXLEN ];
679+ _asn1obj2py (const ASN1_OBJECT * name , int no_name )
680+ {
681+ char buf [X509_NAME_MAXLEN ];
682+ char * namebuf = buf ;
682683 int buflen ;
683- PyObject * name_obj ;
684- PyObject * value_obj ;
685- PyObject * attr ;
686- unsigned char * valuebuf = NULL ;
684+ PyObject * name_obj = NULL ;
687685
688- buflen = OBJ_obj2txt (namebuf , sizeof ( namebuf ) , name , 0 );
686+ buflen = OBJ_obj2txt (namebuf , X509_NAME_MAXLEN , name , no_name );
689687 if (buflen < 0 ) {
690688 _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
691- goto fail ;
689+ return NULL ;
690+ }
691+ /* initial buffer is too small for oid + terminating null byte */
692+ if (buflen > X509_NAME_MAXLEN - 1 ) {
693+ /* make OBJ_obj2txt() calculate the required buflen */
694+ buflen = OBJ_obj2txt (NULL , 0 , name , no_name );
695+ /* allocate len + 1 for terminating NULL byte */
696+ namebuf = PyMem_Malloc (buflen + 1 );
697+ if (namebuf == NULL ) {
698+ PyErr_NoMemory ();
699+ return NULL ;
700+ }
701+ buflen = OBJ_obj2txt (namebuf , buflen + 1 , name , no_name );
702+ if (buflen < 0 ) {
703+ _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
704+ goto done ;
705+ }
706+ }
707+ if (!buflen && no_name ) {
708+ Py_INCREF (Py_None );
709+ name_obj = Py_None ;
710+ }
711+ else {
712+ name_obj = PyString_FromStringAndSize (namebuf , buflen );
692713 }
693- name_obj = PyString_FromStringAndSize (namebuf , buflen );
694- if (name_obj == NULL )
695- goto fail ;
714+
715+ done :
716+ if (buf != namebuf ) {
717+ PyMem_Free (namebuf );
718+ }
719+ return name_obj ;
720+ }
721+
722+ static PyObject *
723+ _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value )
724+ {
725+ Py_ssize_t buflen ;
726+ unsigned char * valuebuf = NULL ;
727+ PyObject * attr , * value_obj ;
696728
697729 buflen = ASN1_STRING_to_UTF8 (& valuebuf , value );
698730 if (buflen < 0 ) {
699731 _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
700- Py_DECREF (name_obj );
701- goto fail ;
732+ return NULL ;
702733 }
703734 value_obj = PyUnicode_DecodeUTF8 ((char * ) valuebuf ,
704735 buflen , "strict" );
736+
737+ attr = Py_BuildValue ("NN" , _asn1obj2py (name , 0 ), value_obj );
705738 OPENSSL_free (valuebuf );
706- if (value_obj == NULL ) {
707- Py_DECREF (name_obj );
708- goto fail ;
709- }
710- attr = PyTuple_New (2 );
711- if (attr == NULL ) {
712- Py_DECREF (name_obj );
713- Py_DECREF (value_obj );
714- goto fail ;
715- }
716- PyTuple_SET_ITEM (attr , 0 , name_obj );
717- PyTuple_SET_ITEM (attr , 1 , value_obj );
718739 return attr ;
719-
720- fail :
721- return NULL ;
722740}
723741
724742static PyObject *
@@ -3574,8 +3592,6 @@ asn1obj2py(ASN1_OBJECT *obj)
35743592{
35753593 int nid ;
35763594 const char * ln , * sn ;
3577- char buf [100 ];
3578- Py_ssize_t buflen ;
35793595
35803596 nid = OBJ_obj2nid (obj );
35813597 if (nid == NID_undef ) {
@@ -3584,16 +3600,7 @@ asn1obj2py(ASN1_OBJECT *obj)
35843600 }
35853601 sn = OBJ_nid2sn (nid );
35863602 ln = OBJ_nid2ln (nid );
3587- buflen = OBJ_obj2txt (buf , sizeof (buf ), obj , 1 );
3588- if (buflen < 0 ) {
3589- _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
3590- return NULL ;
3591- }
3592- if (buflen ) {
3593- return Py_BuildValue ("isss#" , nid , sn , ln , buf , buflen );
3594- } else {
3595- return Py_BuildValue ("issO" , nid , sn , ln , Py_None );
3596- }
3603+ return Py_BuildValue ("issN" , nid , sn , ln , _asn1obj2py (obj , 1 ));
35973604}
35983605
35993606PyDoc_STRVAR (PySSL_txt2obj_doc ,
0 commit comments