Mercurial > cpython-lru_cache-weakref
diff Python/marshal.c @ 36866:9eb24f92a784 legacy-trunk
Change int to Py_ssize_t in several places.
Add (int) casts to silence compiler warnings.
Raise Python exceptions for overflows.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Tue, 07 Mar 2006 12:08:51 +0000 |
| parents | 688795873ff1 |
| children | a5298f371be7 |
line wrap: on
line diff
--- a/Python/marshal.c Tue Mar 07 11:58:50 2006 +0000 +++ b/Python/marshal.c Tue Mar 07 12:08:51 2006 +0000 @@ -186,7 +186,7 @@ n = strlen(buf); w_byte(TYPE_FLOAT, p); w_byte((int)n, p); - w_string(buf, n, p); + w_string(buf, (int)n, p); } } #ifndef WITHOUT_COMPLEX @@ -215,16 +215,16 @@ PyComplex_RealAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + n = strlen(buf); + w_byte((int)n, p); + w_string(buf, (int)n, p); temp = (PyFloatObject*)PyFloat_FromDouble( PyComplex_ImagAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + n = strlen(buf); + w_byte((int)n, p); + w_string(buf, (int)n, p); } } #endif @@ -248,8 +248,14 @@ w_byte(TYPE_STRING, p); } n = PyString_GET_SIZE(v); + if (n > INT_MAX) { + /* huge strings are not supported */ + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(PyString_AS_STRING(v), n, p); + w_string(PyString_AS_STRING(v), (int)n, p); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(v)) { @@ -262,8 +268,13 @@ } w_byte(TYPE_UNICODE, p); n = PyString_GET_SIZE(utf8); + if (n > INT_MAX) { + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(PyString_AS_STRING(utf8), n, p); + w_string(PyString_AS_STRING(utf8), (int)n, p); Py_DECREF(utf8); } #endif @@ -350,8 +361,13 @@ PyBufferProcs *pb = v->ob_type->tp_as_buffer; w_byte(TYPE_STRING, p); n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s); + if (n > INT_MAX) { + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(s, n, p); + w_string(s, (int)n, p); } else { w_byte(TYPE_UNKNOWN, p);
