diff options
author | Georg Brandl <georg@python.org> | 2007-03-06 18:44:35 +0000 |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2007-03-06 18:44:35 +0000 |
commit | ffb0a804c6eba81d6ed15e11b88f9fbb670d0cfe (patch) | |
tree | 5c2412a8bae1d102b77784f922c34e0b9b6353ec /Objects/longobject.c | |
parent | 8c9b3d6a137334777a2652a9fcc2eaac390b2921 (diff) | |
download | cpython-git-ffb0a804c6eba81d6ed15e11b88f9fbb670d0cfe.tar.gz |
Patch #1638879: don't accept strings with embedded NUL bytes in long().
(backport from rev. 54173)
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r-- | Objects/longobject.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c index 4d886cd724..cb4900d9d0 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3287,8 +3287,25 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return PyLong_FromLong(0L); if (base == -909) return PyNumber_Long(x); - else if (PyString_Check(x)) + else if (PyString_Check(x)) { + /* Since PyLong_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 PyLong_FromString does. */ + PyObject *srepr; + srepr = PyObject_Repr(x); + if (srepr == NULL) + return NULL; + PyErr_Format(PyExc_ValueError, + "invalid literal for long() with base %d: %s", + base, PyString_AS_STRING(srepr)); + Py_DECREF(srepr); + return NULL; + } return PyLong_FromString(PyString_AS_STRING(x), NULL, base); + } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(x)) return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x), |