mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
Issue #22518: Fixed integer overflow issues in "backslashreplace",
"xmlcharrefreplace", and "surrogatepass" error handlers.
This commit is contained in:
commit
8d1e18ef1f
2 changed files with 11 additions and 2 deletions
|
|
@ -10,6 +10,9 @@ Release date: TBA
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #22518: Fixed integer overflow issues in "backslashreplace",
|
||||||
|
"xmlcharrefreplace", and "surrogatepass" error handlers.
|
||||||
|
|
||||||
- Issue #22540: speed up `PyObject_IsInstance` and `PyObject_IsSubclass` in the
|
- Issue #22540: speed up `PyObject_IsInstance` and `PyObject_IsSubclass` in the
|
||||||
common case that the second argument has metaclass `type`.
|
common case that the second argument has metaclass `type`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -773,7 +773,7 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
|
||||||
Py_ssize_t end;
|
Py_ssize_t end;
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
unsigned char *outp;
|
unsigned char *outp;
|
||||||
int ressize;
|
Py_ssize_t ressize;
|
||||||
Py_UCS4 ch;
|
Py_UCS4 ch;
|
||||||
if (PyUnicodeEncodeError_GetStart(exc, &start))
|
if (PyUnicodeEncodeError_GetStart(exc, &start))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -781,6 +781,8 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
|
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (end - start > PY_SSIZE_T_MAX / (2+7+1))
|
||||||
|
end = start + PY_SSIZE_T_MAX / (2+7+1);
|
||||||
for (i = start, ressize = 0; i < end; ++i) {
|
for (i = start, ressize = 0; i < end; ++i) {
|
||||||
/* object is guaranteed to be "ready" */
|
/* object is guaranteed to be "ready" */
|
||||||
ch = PyUnicode_READ_CHAR(object, i);
|
ch = PyUnicode_READ_CHAR(object, i);
|
||||||
|
|
@ -869,7 +871,7 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
|
||||||
Py_ssize_t end;
|
Py_ssize_t end;
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
unsigned char *outp;
|
unsigned char *outp;
|
||||||
int ressize;
|
Py_ssize_t ressize;
|
||||||
Py_UCS4 c;
|
Py_UCS4 c;
|
||||||
if (PyUnicodeEncodeError_GetStart(exc, &start))
|
if (PyUnicodeEncodeError_GetStart(exc, &start))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -877,6 +879,8 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
|
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (end - start > PY_SSIZE_T_MAX / (1+1+8))
|
||||||
|
end = start + PY_SSIZE_T_MAX / (1+1+8);
|
||||||
for (i = start, ressize = 0; i < end; ++i) {
|
for (i = start, ressize = 0; i < end; ++i) {
|
||||||
/* object is guaranteed to be "ready" */
|
/* object is guaranteed to be "ready" */
|
||||||
c = PyUnicode_READ_CHAR(object, i);
|
c = PyUnicode_READ_CHAR(object, i);
|
||||||
|
|
@ -1036,6 +1040,8 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (end - start > PY_SSIZE_T_MAX / bytelength)
|
||||||
|
end = start + PY_SSIZE_T_MAX / bytelength;
|
||||||
res = PyBytes_FromStringAndSize(NULL, bytelength*(end-start));
|
res = PyBytes_FromStringAndSize(NULL, bytelength*(end-start));
|
||||||
if (!res) {
|
if (!res) {
|
||||||
Py_DECREF(object);
|
Py_DECREF(object);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue