@@ -787,49 +787,64 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
787
787
}
788
788
789
789
static PyObject *
790
- _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value ) {
791
-
792
- char namebuf [X509_NAME_MAXLEN ];
790
+ _asn1obj2py (const ASN1_OBJECT * name , int no_name )
791
+ {
792
+ char buf [X509_NAME_MAXLEN ];
793
+ char * namebuf = buf ;
793
794
int buflen ;
794
- PyObject * name_obj ;
795
- PyObject * value_obj ;
796
- PyObject * attr ;
797
- unsigned char * valuebuf = NULL ;
795
+ PyObject * name_obj = NULL ;
798
796
799
- buflen = OBJ_obj2txt (namebuf , sizeof ( namebuf ) , name , 0 );
797
+ buflen = OBJ_obj2txt (namebuf , X509_NAME_MAXLEN , name , no_name );
800
798
if (buflen < 0 ) {
801
799
_setSSLError (NULL , 0 , __FILE__ , __LINE__ );
802
- goto fail ;
800
+ return NULL ;
803
801
}
804
- name_obj = PyUnicode_FromStringAndSize (namebuf , buflen );
805
- if (name_obj == NULL )
806
- goto fail ;
802
+ /* initial buffer is too small for oid + terminating null byte */
803
+ if (buflen > X509_NAME_MAXLEN - 1 ) {
804
+ /* make OBJ_obj2txt() calculate the required buflen */
805
+ buflen = OBJ_obj2txt (NULL , 0 , name , no_name );
806
+ /* allocate len + 1 for terminating NULL byte */
807
+ namebuf = PyMem_Malloc (buflen + 1 );
808
+ if (namebuf == NULL ) {
809
+ PyErr_NoMemory ();
810
+ return NULL ;
811
+ }
812
+ buflen = OBJ_obj2txt (namebuf , buflen + 1 , name , no_name );
813
+ if (buflen < 0 ) {
814
+ _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
815
+ goto done ;
816
+ }
817
+ }
818
+ if (!buflen && no_name ) {
819
+ Py_INCREF (Py_None );
820
+ name_obj = Py_None ;
821
+ }
822
+ else {
823
+ name_obj = PyUnicode_FromStringAndSize (namebuf , buflen );
824
+ }
825
+
826
+ done :
827
+ if (buf != namebuf ) {
828
+ PyMem_Free (namebuf );
829
+ }
830
+ return name_obj ;
831
+ }
832
+
833
+ static PyObject *
834
+ _create_tuple_for_attribute (ASN1_OBJECT * name , ASN1_STRING * value )
835
+ {
836
+ Py_ssize_t buflen ;
837
+ unsigned char * valuebuf = NULL ;
838
+ PyObject * attr ;
807
839
808
840
buflen = ASN1_STRING_to_UTF8 (& valuebuf , value );
809
841
if (buflen < 0 ) {
810
842
_setSSLError (NULL , 0 , __FILE__ , __LINE__ );
811
- Py_DECREF (name_obj );
812
- goto fail ;
843
+ return NULL ;
813
844
}
814
- value_obj = PyUnicode_DecodeUTF8 ((char * ) valuebuf ,
815
- buflen , "strict" );
845
+ attr = Py_BuildValue ("Ns#" , _asn1obj2py (name , 0 ), valuebuf , buflen );
816
846
OPENSSL_free (valuebuf );
817
- if (value_obj == NULL ) {
818
- Py_DECREF (name_obj );
819
- goto fail ;
820
- }
821
- attr = PyTuple_New (2 );
822
- if (attr == NULL ) {
823
- Py_DECREF (name_obj );
824
- Py_DECREF (value_obj );
825
- goto fail ;
826
- }
827
- PyTuple_SET_ITEM (attr , 0 , name_obj );
828
- PyTuple_SET_ITEM (attr , 1 , value_obj );
829
847
return attr ;
830
-
831
- fail :
832
- return NULL ;
833
848
}
834
849
835
850
static PyObject *
@@ -4676,8 +4691,6 @@ asn1obj2py(ASN1_OBJECT *obj)
4676
4691
{
4677
4692
int nid ;
4678
4693
const char * ln , * sn ;
4679
- char buf [100 ];
4680
- Py_ssize_t buflen ;
4681
4694
4682
4695
nid = OBJ_obj2nid (obj );
4683
4696
if (nid == NID_undef ) {
@@ -4686,16 +4699,7 @@ asn1obj2py(ASN1_OBJECT *obj)
4686
4699
}
4687
4700
sn = OBJ_nid2sn (nid );
4688
4701
ln = OBJ_nid2ln (nid );
4689
- buflen = OBJ_obj2txt (buf , sizeof (buf ), obj , 1 );
4690
- if (buflen < 0 ) {
4691
- _setSSLError (NULL , 0 , __FILE__ , __LINE__ );
4692
- return NULL ;
4693
- }
4694
- if (buflen ) {
4695
- return Py_BuildValue ("isss#" , nid , sn , ln , buf , buflen );
4696
- } else {
4697
- return Py_BuildValue ("issO" , nid , sn , ln , Py_None );
4698
- }
4702
+ return Py_BuildValue ("issN" , nid , sn , ln , _asn1obj2py (obj , 1 ));
4699
4703
}
4700
4704
4701
4705
/*[clinic input]
0 commit comments