From: Georg Brandl Date: Thu, 12 Oct 2006 11:28:04 +0000 (+0000) Subject: Bug #1545497: when given an explicit base, int() did ignore NULs X-Git-Tag: v2.5.1c1~326 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd4c398c27382502ba514705b69ed1ec72ed9755;p=python Bug #1545497: when given an explicit base, int() did ignore NULs embedded in the string to convert. (backport from rev. 52305) --- diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index f7cf8118e2..72b696690b 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 79ffe86847..148dfeef6f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5.1c1? 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 a4d50be129..8aa8d0b39c 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),