bpo-30502: Fix handling of long oids in ssl. (#2909) · python/cpython@e503ca5 (original) (raw)
`@@ -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]
`