@@ -763,49 +763,64 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
763763}
764764
765765static PyObject *
766- _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value ) {
767-
768- char namebuf [X509_NAME_MAXLEN ];
766+ _asn1obj2py (const ASN1_OBJECT * name , int no_name )
767+ {
768+ char buf [X509_NAME_MAXLEN ];
769+ char * namebuf = buf ;
769770 int buflen ;
770- PyObject * name_obj ;
771- PyObject * value_obj ;
772- PyObject * attr ;
773- unsigned char * valuebuf = NULL ;
771+ PyObject * name_obj = NULL ;
774772
775- buflen = OBJ_obj2txt (namebuf , sizeof ( namebuf ) , name , 0 );
773+ buflen = OBJ_obj2txt (namebuf , X509_NAME_MAXLEN , name , no_name );
776774 if (buflen < 0 ) {
777775 _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
778- goto fail ;
776+ return NULL ;
779777 }
780- name_obj = PyUnicode_FromStringAndSize (namebuf , buflen );
781- if (name_obj == NULL )
782- goto fail ;
778+ /* initial buffer is too small for oid + terminating null byte */
779+ if (buflen > X509_NAME_MAXLEN - 1 ) {
780+ /* make OBJ_obj2txt() calculate the required buflen */
781+ buflen = OBJ_obj2txt (NULL , 0 , name , no_name );
782+ /* allocate len + 1 for terminating NULL byte */
783+ namebuf = PyMem_Malloc (buflen + 1 );
784+ if (namebuf == NULL ) {
785+ PyErr_NoMemory ();
786+ return NULL ;
787+ }
788+ buflen = OBJ_obj2txt (namebuf , buflen + 1 , name , no_name );
789+ if (buflen < 0 ) {
790+ _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
791+ goto done ;
792+ }
793+ }
794+ if (!buflen && no_name ) {
795+ Py_INCREF (Py_None );
796+ name_obj = Py_None ;
797+ }
798+ else {
799+ name_obj = PyUnicode_FromStringAndSize (namebuf , buflen );
800+ }
801+
802+ done :
803+ if (buf != namebuf ) {
804+ PyMem_Free (namebuf );
805+ }
806+ return name_obj ;
807+ }
808+
809+ static PyObject *
810+ _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value )
811+ {
812+ Py_ssize_t buflen ;
813+ unsigned char * valuebuf = NULL ;
814+ PyObject * attr ;
783815
784816 buflen = ASN1_STRING_to_UTF8 (& valuebuf , value );
785817 if (buflen < 0 ) {
786818 _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
787- Py_DECREF (name_obj );
788- goto fail ;
819+ return NULL ;
789820 }
790- value_obj = PyUnicode_DecodeUTF8 ((char * ) valuebuf ,
791- buflen , "strict" );
821+ attr = Py_BuildValue ("Ns#" , _asn1obj2py (name , 0 ), valuebuf , buflen );
792822 OPENSSL_free (valuebuf );
793- if (value_obj == NULL ) {
794- Py_DECREF (name_obj );
795- goto fail ;
796- }
797- attr = PyTuple_New (2 );
798- if (attr == NULL ) {
799- Py_DECREF (name_obj );
800- Py_DECREF (value_obj );
801- goto fail ;
802- }
803- PyTuple_SET_ITEM (attr , 0 , name_obj );
804- PyTuple_SET_ITEM (attr , 1 , value_obj );
805823 return attr ;
806-
807- fail :
808- return NULL ;
809824}
810825
811826static PyObject *
@@ -4669,8 +4684,6 @@ asn1obj2py(ASN1_OBJECT *obj)
46694684{
46704685 int nid ;
46714686 const char * ln , * sn ;
4672- char buf [100 ];
4673- Py_ssize_t buflen ;
46744687
46754688 nid = OBJ_obj2nid (obj );
46764689 if (nid == NID_undef ) {
@@ -4679,16 +4692,7 @@ asn1obj2py(ASN1_OBJECT *obj)
46794692 }
46804693 sn = OBJ_nid2sn (nid );
46814694 ln = OBJ_nid2ln (nid );
4682- buflen = OBJ_obj2txt (buf , sizeof (buf ), obj , 1 );
4683- if (buflen < 0 ) {
4684- _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
4685- return NULL ;
4686- }
4687- if (buflen ) {
4688- return Py_BuildValue ("isss#" , nid , sn , ln , buf , buflen );
4689- } else {
4690- return Py_BuildValue ("issO" , nid , sn , ln , Py_None );
4691- }
4695+ return Py_BuildValue ("issN" , nid , sn , ln , _asn1obj2py (obj , 1 ));
46924696}
46934697
46944698/*[clinic input]
0 commit comments