summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2005-10-02 01:48:49 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2005-10-02 01:48:49 (GMT)
commit40d37814166380b0fb585f818b446159cfbcec0f (patch)
tree80082c1713d2e7951b29b928e57ece73d3a4883b
parentd45014b236f5a8707c104bb5b47bbb006e3bd4f3 (diff)
downloadcpython-40d37814166380b0fb585f818b446159cfbcec0f.zip
cpython-40d37814166380b0fb585f818b446159cfbcec0f.tar.gz
cpython-40d37814166380b0fb585f818b446159cfbcec0f.tar.bz2
- Fix segfault with invalid coding.
- SF Bug #772896, unknown encoding results in MemoryError, which is not helpful I will only backport the segfault fix. I'll let Anthony decide if he wants the other changes backported. I will do the backport if asked.
-rw-r--r--Lib/test/bad_coding.py1
-rw-r--r--Lib/test/test_coding.py21
-rw-r--r--Misc/NEWS4
-rw-r--r--Parser/parsetok.c2
-rw-r--r--Parser/pgenmain.c7
-rw-r--r--Parser/tokenizer.c5
-rw-r--r--Python/pythonrun.c2
7 files changed, 39 insertions, 3 deletions
diff --git a/Lib/test/bad_coding.py b/Lib/test/bad_coding.py
new file mode 100644
index 0000000..971b0a8
--- /dev/null
+++ b/Lib/test/bad_coding.py
@@ -0,0 +1 @@
+# -*- coding: uft-8 -*-
diff --git a/Lib/test/test_coding.py b/Lib/test/test_coding.py
new file mode 100644
index 0000000..aa7241d
--- /dev/null
+++ b/Lib/test/test_coding.py
@@ -0,0 +1,21 @@
+
+import test.test_support, unittest
+import os
+
+class CodingTest(unittest.TestCase):
+ def test_bad_coding(self):
+ module_name = 'bad_coding'
+ self.assertRaises(SyntaxError, __import__, 'test.' + module_name)
+
+ path = os.path.dirname(__file__)
+ filename = os.path.join(path, module_name + '.py')
+ fp = open(filename)
+ text = fp.read()
+ fp.close()
+ self.assertRaises(SyntaxError, compile, text, filename, 'exec')
+
+def test_main():
+ test.test_support.run_unittest(CodingTest)
+
+if __name__ == "__main__":
+ test_main()
diff --git a/Misc/NEWS b/Misc/NEWS
index 2c58dae..bf40e9d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 2.5 alpha 1?
Core and builtins
-----------------
+- Fix segfault with invalid coding.
+
+- SF bug #772896: unknown encoding results in MemoryError.
+
- All iterators now have a Boolean value of true. Formerly, some iterators
supported a __len__() method which evaluated to False when the iterator
was empty.
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 1fa9739..1d25437 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -42,7 +42,7 @@ PyParser_ParseStringFlagsFilename(const char *s, const char *filename,
initerr(err_ret, filename);
if ((tok = PyTokenizer_FromString(s)) == NULL) {
- err_ret->error = E_NOMEM;
+ err_ret->error = PyErr_Occurred() ? E_DECODE : E_NOMEM;
return NULL;
}
diff --git a/Parser/pgenmain.c b/Parser/pgenmain.c
index 64485eb..695e2b7 100644
--- a/Parser/pgenmain.c
+++ b/Parser/pgenmain.c
@@ -116,6 +116,13 @@ getgrammar(char *filename)
return g;
}
+/* Can't happen in pgen */
+PyObject*
+PyErr_Occurred()
+{
+ return 0;
+}
+
void
Py_FatalError(const char *msg)
{
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 6957cc9..ce61322 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -603,8 +603,11 @@ decode_str(const char *str, struct tok_state *tok)
if (tok->enc != NULL) {
assert(utf8 == NULL);
utf8 = translate_into_utf8(str, tok->enc);
- if (utf8 == NULL)
+ if (utf8 == NULL) {
+ PyErr_Format(PyExc_SyntaxError,
+ "unknown encoding: %s", tok->enc);
return NULL;
+ }
str = PyString_AsString(utf8);
}
#endif
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 68948fc..e007f98 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1487,7 +1487,7 @@ err_input(perrdetail *err)
msg = "unknown decode error";
Py_DECREF(type);
Py_DECREF(value);
- Py_DECREF(tb);
+ Py_XDECREF(tb);
break;
}
case E_LINECONT: