aboutsummaryrefslogtreecommitdiff
path: root/lang/python31/files/patch-objects_stringobject.c
diff options
context:
space:
mode:
authorMartin Wilke <miwi@FreeBSD.org>2008-09-08 00:14:06 +0000
committerMartin Wilke <miwi@FreeBSD.org>2008-09-08 00:14:06 +0000
commit8a1ff65b9b4abb36af6477b5c168037be07d4f71 (patch)
treeb9ac213a94e3a8e1c94343b9c5297f42639bc33e /lang/python31/files/patch-objects_stringobject.c
parent07d5244e8b5f934bc45867d9c55e8e55d26af59e (diff)
Notes
Diffstat (limited to 'lang/python31/files/patch-objects_stringobject.c')
-rw-r--r--lang/python31/files/patch-objects_stringobject.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/lang/python31/files/patch-objects_stringobject.c b/lang/python31/files/patch-objects_stringobject.c
new file mode 100644
index 000000000000..af55c78a4928
--- /dev/null
+++ b/lang/python31/files/patch-objects_stringobject.c
@@ -0,0 +1,49 @@
+--- Objects/stringobject.c.orig 2007-11-07 01:19:49.000000000 +0000
++++ Objects/stringobject.c 2008-08-30 10:16:13.000000000 +0100
+@@ -71,6 +71,11 @@
+ return (PyObject *)op;
+ }
+
++ if (size > PY_SSIZE_T_MAX - sizeof(PyStringObject)) {
++ PyErr_SetString(PyExc_OverflowError, "string is too large");
++ return NULL;
++ }
++
+ /* Inline PyObject_NewVar */
+ op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size);
+ if (op == NULL)
+@@ -106,7 +111,7 @@
+
+ assert(str != NULL);
+ size = strlen(str);
+- if (size > PY_SSIZE_T_MAX) {
++ if (size > PY_SSIZE_T_MAX - sizeof(PyStringObject)) {
+ PyErr_SetString(PyExc_OverflowError,
+ "string is too long for a Python string");
+ return NULL;
+@@ -967,14 +972,24 @@
+ Py_INCREF(a);
+ return (PyObject *)a;
+ }
++ /* Check that string sizes are not negative, to prevent an
++ overflow in cases where we are passed incorrectly-created
++ strings with negative lengths (due to a bug in other code).
++ */
+ size = a->ob_size + b->ob_size;
+- if (size < 0) {
++ if (a->ob_size < 0 || b->ob_size < 0 ||
++ a->ob_size > PY_SSIZE_T_MAX - b->ob_size) {
+ PyErr_SetString(PyExc_OverflowError,
+ "strings are too large to concat");
+ return NULL;
+ }
+
+ /* Inline PyObject_NewVar */
++ if (size > PY_SSIZE_T_MAX - sizeof(PyStringObject)) {
++ PyErr_SetString(PyExc_OverflowError,
++ "strings are too large to concat");
++ return NULL;
++ }
+ op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size);
+ if (op == NULL)
+ return PyErr_NoMemory();