[3.6] bpo-30502: Fix handling of long oids in ssl. (GH-2909) (#3321) · python/cpython@f201e88 (original) (raw)
`@@ -763,49 +763,64 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
`
763
763
`}
`
764
764
``
765
765
`static 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;
`
769
770
`int buflen;
`
770
``
`-
PyObject *name_obj;
`
771
``
`-
PyObject *value_obj;
`
772
``
`-
PyObject *attr;
`
773
``
`-
unsigned char *valuebuf = NULL;
`
``
771
`+
PyObject *name_obj = NULL;
`
774
772
``
775
``
`-
buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
`
``
773
`+
buflen = OBJ_obj2txt(namebuf, X509_NAME_MAXLEN, name, no_name);
`
776
774
`if (buflen < 0) {
`
777
775
`_setSSLError(NULL, 0, FILE, LINE);
`
778
``
`-
goto fail;
`
``
776
`+
return NULL;
`
779
777
` }
`
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;
`
783
815
``
784
816
`buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
`
785
817
`if (buflen < 0) {
`
786
818
`_setSSLError(NULL, 0, FILE, LINE);
`
787
``
`-
Py_DECREF(name_obj);
`
788
``
`-
goto fail;
`
``
819
`+
return NULL;
`
789
820
` }
`
790
``
`-
value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
`
791
``
`-
buflen, "strict");
`
``
821
`+
attr = Py_BuildValue("Ns#", _asn1obj2py(name, 0), valuebuf, buflen);
`
792
822
`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);
`
805
823
`return attr;
`
806
``
-
807
``
`-
fail:
`
808
``
`-
return NULL;
`
809
824
`}
`
810
825
``
811
826
`static PyObject *
`
`@@ -4669,8 +4684,6 @@ asn1obj2py(ASN1_OBJECT *obj)
`
4669
4684
`{
`
4670
4685
`int nid;
`
4671
4686
`const char *ln, *sn;
`
4672
``
`-
char buf[100];
`
4673
``
`-
Py_ssize_t buflen;
`
4674
4687
``
4675
4688
`nid = OBJ_obj2nid(obj);
`
4676
4689
`if (nid == NID_undef) {
`
`@@ -4679,16 +4692,7 @@ asn1obj2py(ASN1_OBJECT *obj)
`
4679
4692
` }
`
4680
4693
`sn = OBJ_nid2sn(nid);
`
4681
4694
`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));
`
4692
4696
`}
`
4693
4697
``
4694
4698
`/*[clinic input]
`