summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/intobject.c18
-rw-r--r--Objects/longobject.c16
2 files changed, 28 insertions, 6 deletions
diff --git a/Objects/intobject.c b/Objects/intobject.c
index e3af063..63034bc 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -335,7 +335,8 @@ PyInt_FromString(char *s, char **pend, int base)
{
char *end;
long x;
- char buffer[256]; /* For errors */
+ Py_ssize_t slen;
+ PyObject *sobj, *srepr;
if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError,
@@ -359,9 +360,18 @@ PyInt_FromString(char *s, char **pend, int base)
end++;
if (*end != '\0') {
bad:
- PyOS_snprintf(buffer, sizeof(buffer),
- "invalid literal for int(): %.200s", s);
- PyErr_SetString(PyExc_ValueError, buffer);
+ slen = strlen(s) < 200 ? strlen(s) : 200;
+ sobj = PyString_FromStringAndSize(s, slen);
+ if (sobj == NULL)
+ return NULL;
+ srepr = PyObject_Repr(sobj);
+ Py_DECREF(sobj);
+ 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;
}
else if (errno != 0)
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 2d3dce6..634252f 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -1400,6 +1400,8 @@ PyLong_FromString(char *str, char **pend, int base)
int sign = 1;
char *start, *orig_str = str;
PyLongObject *z;
+ PyObject *strobj, *strrepr;
+ Py_ssize_t slen;
if ((base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError,
@@ -1465,9 +1467,19 @@ PyLong_FromString(char *str, char **pend, int base)
return (PyObject *) z;
onError:
- PyErr_Format(PyExc_ValueError,
- "invalid literal for long(): %.200s", orig_str);
Py_XDECREF(z);
+ slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
+ strobj = PyString_FromStringAndSize(orig_str, slen);
+ if (strobj == NULL)
+ return NULL;
+ strrepr = PyObject_Repr(strobj);
+ Py_DECREF(strobj);
+ if (strrepr == NULL)
+ return NULL;
+ PyErr_Format(PyExc_ValueError,
+ "invalid literal for long() with base %d: %s",
+ base, PyString_AS_STRING(strrepr));
+ Py_DECREF(strrepr);
return NULL;
}