summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/pickletester.py1
-rw-r--r--Objects/stringobject.c13
2 files changed, 9 insertions, 5 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 3dc7901..2294c3d 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -199,6 +199,7 @@ class AbstractPickleTests(unittest.TestCase):
"'abc", # quote is not closed
"'abc\"", # open quote and close quote don't match
"'abc' ?", # junk after close quote
+ "'\\'", # trailing backslash
# some tests of the quoting rules
#"'abc\"\''",
#"'\\\\a\'\'\'\\\'\\\\\''",
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 19c2834..a21e021 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -546,6 +546,11 @@ PyObject *PyString_DecodeEscape(const char *s,
continue;
}
s++;
+ if (s==end) {
+ PyErr_SetString(PyExc_ValueError,
+ "Trailing \\ in string");
+ goto failed;
+ }
switch (*s++) {
/* XXX This assumes ASCII! */
case '\n': break;
@@ -594,10 +599,9 @@ PyObject *PyString_DecodeEscape(const char *s,
break;
}
if (!errors || strcmp(errors, "strict") == 0) {
- Py_DECREF(v);
PyErr_SetString(PyExc_ValueError,
"invalid \\x escape");
- return NULL;
+ goto failed;
}
if (strcmp(errors, "replace") == 0) {
*p++ = '?';
@@ -608,18 +612,17 @@ PyObject *PyString_DecodeEscape(const char *s,
"decoding error; "
"unknown error handling code: %.400s",
errors);
- return NULL;
+ goto failed;
}
#ifndef Py_USING_UNICODE
case 'u':
case 'U':
case 'N':
if (unicode) {
- Py_DECREF(v);
com_error(com, PyExc_ValueError,
"Unicode escapes not legal "
"when Unicode disabled");
- return NULL;
+ goto failed;
}
#endif
default: