@@ -676,49 +676,67 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
676
676
}
677
677
678
678
static 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 ;
682
683
int buflen ;
683
- PyObject * name_obj ;
684
- PyObject * value_obj ;
685
- PyObject * attr ;
686
- unsigned char * valuebuf = NULL ;
684
+ PyObject * name_obj = NULL ;
687
685
688
- buflen = OBJ_obj2txt (namebuf , sizeof ( namebuf ) , name , 0 );
686
+ buflen = OBJ_obj2txt (namebuf , X509_NAME_MAXLEN , name , no_name );
689
687
if (buflen < 0 ) {
690
688
_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 );
692
713
}
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 ;
696
728
697
729
buflen = ASN1_STRING_to_UTF8 (& valuebuf , value );
698
730
if (buflen < 0 ) {
699
731
_setSSLError (NULL , 0 , __FILE__ , __LINE__ );
700
- Py_DECREF (name_obj );
701
- goto fail ;
732
+ return NULL ;
702
733
}
703
734
value_obj = PyUnicode_DecodeUTF8 ((char * ) valuebuf ,
704
735
buflen , "strict" );
736
+
737
+ attr = Py_BuildValue ("NN" , _asn1obj2py (name , 0 ), value_obj );
705
738
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 );
718
739
return attr ;
719
-
720
- fail :
721
- return NULL ;
722
740
}
723
741
724
742
static PyObject *
@@ -3574,8 +3592,6 @@ asn1obj2py(ASN1_OBJECT *obj)
3574
3592
{
3575
3593
int nid ;
3576
3594
const char * ln , * sn ;
3577
- char buf [100 ];
3578
- Py_ssize_t buflen ;
3579
3595
3580
3596
nid = OBJ_obj2nid (obj );
3581
3597
if (nid == NID_undef ) {
@@ -3584,16 +3600,7 @@ asn1obj2py(ASN1_OBJECT *obj)
3584
3600
}
3585
3601
sn = OBJ_nid2sn (nid );
3586
3602
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 ));
3597
3604
}
3598
3605
3599
3606
PyDoc_STRVAR (PySSL_txt2obj_doc ,
0 commit comments