Commit 8334a4fc authored by Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

Backport of r59241: str.decode fails on very long strings on 64bit platforms.

PyArgs_ParseTuple t# and w# formats truncated the lengths to 32bit.
parent a5463ab7
...@@ -65,13 +65,15 @@ class StrTest(unittest.TestCase): ...@@ -65,13 +65,15 @@ class StrTest(unittest.TestCase):
self.assertEquals(s.count('i'), 1) self.assertEquals(s.count('i'), 1)
self.assertEquals(s.count('j'), 0) self.assertEquals(s.count('j'), 0)
@bigmemtest(minsize=0, memuse=1) @bigmemtest(minsize=_2G + 2, memuse=3)
def test_decode(self, size): def test_decode(self, size):
pass s = '.' * size
self.assertEquals(len(s.decode('utf-8')), size)
@bigmemtest(minsize=0, memuse=1) @bigmemtest(minsize=_2G + 2, memuse=3)
def test_encode(self, size): def test_encode(self, size):
pass s = u'.' * size
self.assertEquals(len(s.encode('utf-8')), size)
@bigmemtest(minsize=_2G, memuse=2) @bigmemtest(minsize=_2G, memuse=2)
def test_endswith(self, size): def test_endswith(self, size):
......
...@@ -12,6 +12,11 @@ What's New in Python 2.5.2c1? ...@@ -12,6 +12,11 @@ What's New in Python 2.5.2c1?
Core and builtins Core and builtins
----------------- -----------------
- Issue #1521: On 64bit platforms, using PyArgs_ParseTuple with the t# of w#
format code incorrectly truncated the length to an int, even when
PY_SSIZE_T_CLEAN is set. The str.decode method used to return incorrect
results with huge strings.
- Issue #1445: Fix a SystemError when accessing the ``cell_contents`` - Issue #1445: Fix a SystemError when accessing the ``cell_contents``
attribute of an empty cell object. attribute of an empty cell object.
......
...@@ -894,7 +894,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -894,7 +894,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
char **buffer; char **buffer;
const char *encoding; const char *encoding;
PyObject *s; PyObject *s;
int size, recode_strings; Py_ssize_t size;
int recode_strings;
/* Get 'e' parameter: the encoding name */ /* Get 'e' parameter: the encoding name */
encoding = (const char *)va_arg(*p_va, const char *); encoding = (const char *)va_arg(*p_va, const char *);
...@@ -1144,7 +1145,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1144,7 +1145,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'w': { /* memory buffer, read-write access */ case 'w': { /* memory buffer, read-write access */
void **p = va_arg(*p_va, void **); void **p = va_arg(*p_va, void **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer; PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
int count; Py_ssize_t count;
if (pb == NULL || if (pb == NULL ||
pb->bf_getwritebuffer == NULL || pb->bf_getwritebuffer == NULL ||
...@@ -1166,7 +1167,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1166,7 +1167,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 't': { /* 8-bit character buffer, read-only access */ case 't': { /* 8-bit character buffer, read-only access */
char **p = va_arg(*p_va, char **); char **p = va_arg(*p_va, char **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer; PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
int count; Py_ssize_t count;
if (*format++ != '#') if (*format++ != '#')
return converterr( return converterr(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment