]> granicus.if.org Git - python/commitdiff
Bug #1545497: when given an explicit base, int() did ignore NULs
authorGeorg Brandl <georg@python.org>
Thu, 12 Oct 2006 11:28:04 +0000 (11:28 +0000)
committerGeorg Brandl <georg@python.org>
Thu, 12 Oct 2006 11:28:04 +0000 (11:28 +0000)
embedded in the string to convert.
 (backport from rev. 52305)

Lib/test/test_builtin.py
Misc/NEWS
Objects/intobject.c

index f7cf8118e2fcea9367f363f59153d82f81cde4c3..72b696690b5a8bc161632911f6cc525c0d6d857b 100644 (file)
@@ -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))
 
index 79ffe86847044de05553f8db126c1d537877c164..148dfeef6f8f7d0adc157fa7811fe9c5d941698d 100644 (file)
--- 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.
 
index a4d50be1294d59bdd10a8194ca92ef298cea3119..8aa8d0b39c3fe991c33943d1fa02ad5fdddb2d15 100644 (file)
@@ -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),