diff options
author | Benjamin Peterson <benjamin@python.org> | 2016-08-14 01:37:20 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2016-08-14 01:37:20 (GMT) |
commit | b6f78c2755489dfcbe4898072ef0cd7dca11ff3d (patch) | |
tree | 5e2a4474bac77328c79a553858c165d396082867 /Modules | |
parent | c0654d4e60a534b51db8c6e857d4a671237c2463 (diff) | |
parent | 91060f26f960ceb2ba9da5f86585836e7c2a8b2d (diff) | |
download | cpython-b6f78c2755489dfcbe4898072ef0cd7dca11ff3d.zip cpython-b6f78c2755489dfcbe4898072ef0cd7dca11ff3d.tar.gz cpython-b6f78c2755489dfcbe4898072ef0cd7dca11ff3d.tar.bz2 |
merge 3.5 (closes #27760)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/binascii.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/Modules/binascii.c b/Modules/binascii.c index 623c298..50b09fe 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1370,6 +1370,7 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, /* First, scan to see how many characters need to be encoded */ in = 0; while (in < datalen) { + Py_ssize_t delta = 0; if ((databuf[in] > 126) || (databuf[in] == '=') || (header && databuf[in] == '_') || @@ -1384,12 +1385,12 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, if ((linelen + 3) >= MAXLINESIZE) { linelen = 0; if (crlf) - odatalen += 3; + delta += 3; else - odatalen += 2; + delta += 2; } linelen += 3; - odatalen += 3; + delta += 3; in++; } else { @@ -1401,11 +1402,11 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, linelen = 0; /* Protect against whitespace on end of line */ if (in && ((databuf[in-1] == ' ') || (databuf[in-1] == '\t'))) - odatalen += 2; + delta += 2; if (crlf) - odatalen += 2; + delta += 2; else - odatalen += 1; + delta += 1; if (databuf[in] == '\r') in += 2; else @@ -1417,15 +1418,20 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, (linelen + 1) >= MAXLINESIZE) { linelen = 0; if (crlf) - odatalen += 3; + delta += 3; else - odatalen += 2; + delta += 2; } linelen++; - odatalen++; + delta++; in++; } } + if (PY_SSIZE_T_MAX - delta < odatalen) { + PyErr_NoMemory(); + return NULL; + } + odatalen += delta; } /* We allocate the output same size as input, this is overkill. |