Skip to content

Commit ca6bce2

Browse files
serhiy-storchakatiran
authored andcommitted
[3.6] bpo-30502: Fix handling of long oids in ssl. (pythonGH-2909)
(cherry picked from commit e503ca5)
1 parent d50ce4f commit ca6bce2

File tree

2 files changed

+48
-43
lines changed

2 files changed

+48
-43
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix handling of long oids in ssl. Based on patch by Christian Heimes.

Modules/_ssl.c

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -763,49 +763,64 @@ _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
763763
}
764764

765765
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;
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

811826
static PyObject *
@@ -4667,8 +4682,6 @@ asn1obj2py(ASN1_OBJECT *obj)
46674682
{
46684683
int nid;
46694684
const char *ln, *sn;
4670-
char buf[100];
4671-
Py_ssize_t buflen;
46724685

46734686
nid = OBJ_obj2nid(obj);
46744687
if (nid == NID_undef) {
@@ -4677,16 +4690,7 @@ asn1obj2py(ASN1_OBJECT *obj)
46774690
}
46784691
sn = OBJ_nid2sn(nid);
46794692
ln = OBJ_nid2ln(nid);
4680-
buflen = OBJ_obj2txt(buf, sizeof(buf), obj, 1);
4681-
if (buflen < 0) {
4682-
_setSSLError(NULL, 0, __FILE__, __LINE__);
4683-
return NULL;
4684-
}
4685-
if (buflen) {
4686-
return Py_BuildValue("isss#", nid, sn, ln, buf, buflen);
4687-
} else {
4688-
return Py_BuildValue("issO", nid, sn, ln, Py_None);
4689-
}
4693+
return Py_BuildValue("issN", nid, sn, ln, _asn1obj2py(obj, 1));
46904694
}
46914695

46924696
/*[clinic input]

0 commit comments

Comments
 (0)