Skip to content

Commit 061ccea

Browse files
serhiy-storchakatiran
authored andcommitted
[2.7] bpo-30502: Fix handling of long oids in ssl. (GH-2909).
(cherry picked from commit e503ca5)
1 parent 57d963b commit 061ccea

File tree

2 files changed

+49
-41
lines changed

2 files changed

+49
-41
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: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -676,49 +676,67 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
676676
}
677677

678678
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;
682683
int buflen;
683-
PyObject *name_obj;
684-
PyObject *value_obj;
685-
PyObject *attr;
686-
unsigned char *valuebuf = NULL;
684+
PyObject *name_obj = NULL;
687685

688-
buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
686+
buflen = OBJ_obj2txt(namebuf, X509_NAME_MAXLEN, name, no_name);
689687
if (buflen < 0) {
690688
_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);
692713
}
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;
696728

697729
buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
698730
if (buflen < 0) {
699731
_setSSLError(NULL, 0, __FILE__, __LINE__);
700-
Py_DECREF(name_obj);
701-
goto fail;
732+
return NULL;
702733
}
703734
value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
704735
buflen, "strict");
736+
737+
attr = Py_BuildValue("NN", _asn1obj2py(name, 0), value_obj);
705738
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);
718739
return attr;
719-
720-
fail:
721-
return NULL;
722740
}
723741

724742
static PyObject *
@@ -3574,8 +3592,6 @@ asn1obj2py(ASN1_OBJECT *obj)
35743592
{
35753593
int nid;
35763594
const char *ln, *sn;
3577-
char buf[100];
3578-
Py_ssize_t buflen;
35793595

35803596
nid = OBJ_obj2nid(obj);
35813597
if (nid == NID_undef) {
@@ -3584,16 +3600,7 @@ asn1obj2py(ASN1_OBJECT *obj)
35843600
}
35853601
sn = OBJ_nid2sn(nid);
35863602
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));
35973604
}
35983605

35993606
PyDoc_STRVAR(PySSL_txt2obj_doc,

0 commit comments

Comments
 (0)