summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2007-11-30 20:51:40 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2007-11-30 20:51:40 (GMT)
commitdafd32b730c246b76a28e4089253e3a2b614df58 (patch)
tree740fe6b260b2daa3de96b66140941337954d5bf3
parentbe49a90eb3c54bd29a8bf3da5875db26d2fa2924 (diff)
downloadcpython-dafd32b730c246b76a28e4089253e3a2b614df58.zip
cpython-dafd32b730c246b76a28e4089253e3a2b614df58.tar.gz
cpython-dafd32b730c246b76a28e4089253e3a2b614df58.tar.bz2
Issue #1521: on 64bit platforms, str.decode fails on very long strings.
The t# and w# formats were not correctly handled. Will backport.
-rw-r--r--Lib/test/test_bigmem.py10
-rw-r--r--Misc/NEWS5
-rw-r--r--Python/getargs.c7
3 files changed, 15 insertions, 7 deletions
diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py
index 6d6c37c..d4fc6eb 100644
--- a/Lib/test/test_bigmem.py
+++ b/Lib/test/test_bigmem.py
@@ -65,13 +65,15 @@ class StrTest(unittest.TestCase):
self.assertEquals(s.count('i'), 1)
self.assertEquals(s.count('j'), 0)
- @bigmemtest(minsize=0, memuse=1)
+ @bigmemtest(minsize=_2G + 2, memuse=3)
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):
- pass
+ s = u'.' * size
+ self.assertEquals(len(s.encode('utf-8')), size)
@bigmemtest(minsize=_2G, memuse=2)
def test_endswith(self, size):
diff --git a/Misc/NEWS b/Misc/NEWS
index 05b7491..4fa85c6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,11 @@ What's New in Python 2.6 alpha 1?
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 #1402: Fix a crash on exit, when another thread is still running, and
if the deallocation of its frames somehow calls the PyGILState_Ensure() /
PyGILState_Release() functions.
diff --git a/Python/getargs.c b/Python/getargs.c
index a848116..2cae516 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -894,7 +894,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
char **buffer;
const char *encoding;
PyObject *s;
- int size, recode_strings;
+ Py_ssize_t size;
+ int recode_strings;
/* Get 'e' parameter: the encoding name */
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,
case 'w': { /* memory buffer, read-write access */
void **p = va_arg(*p_va, void **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
- int count;
+ Py_ssize_t count;
if (pb == NULL ||
pb->bf_getwritebuffer == NULL ||
@@ -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 */
char **p = va_arg(*p_va, char **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
- int count;
+ Py_ssize_t count;
if (*format++ != '#')
return converterr(