From 2c1375c8db6d62128f594aec3820292576daff8b Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 12 Oct 2006 11:27:59 +0000 Subject: Bug #1545497: when given an explicit base, int() did ignore NULs embedded in the string to convert. --- Lib/test/test_builtin.py | 5 +++++ Misc/NEWS | 3 +++ Objects/intobject.c | 21 +++++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index f7cf811..72b6966 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -729,6 +729,11 @@ class BuiltinTest(unittest.TestCase): self.assertRaises(ValueError, int, '123\0') self.assertRaises(ValueError, int, '53', 40) + # SF bug 1545497: embedded NULs were not detected with + # explicit base + self.assertRaises(ValueError, int, '123\0', 10) + self.assertRaises(ValueError, int, '123\x00 245', 20) + x = int('1' * 600) self.assert_(isinstance(x, long)) diff --git a/Misc/NEWS b/Misc/NEWS index 605b1d8..cd21eea 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1? Core and builtins ----------------- +- Bug #1545497: when given an explicit base, int() did ignore NULs + embedded in the string to convert. + - Bug #1569998: break inside a try statement (outside a loop) is now recognized and rejected. diff --git a/Objects/intobject.c b/Objects/intobject.c index a4d50be..8aa8d0b 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -987,8 +987,25 @@ int_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return PyInt_FromLong(0L); if (base == -909) return PyNumber_Int(x); - if (PyString_Check(x)) - return PyInt_FromString(PyString_AS_STRING(x), NULL, base); + if (PyString_Check(x)) { + /* Since PyInt_FromString doesn't have a length parameter, + * check here for possible NULs in the string. */ + char *string = PyString_AS_STRING(x); + if (strlen(string) != PyString_Size(x)) { + /* create a repr() of the input string, + * just like PyInt_FromString does */ + PyObject *srepr; + srepr = PyObject_Repr(x); + if (srepr == NULL) + return NULL; + PyErr_Format(PyExc_ValueError, + "invalid literal for int() with base %d: %s", + base, PyString_AS_STRING(srepr)); + Py_DECREF(srepr); + return NULL; + } + return PyInt_FromString(string, NULL, base); + } #ifdef Py_USING_UNICODE if (PyUnicode_Check(x)) return PyInt_FromUnicode(PyUnicode_AS_UNICODE(x), -- cgit v0.12