diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-02 01:48:49 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2005-10-02 01:48:49 (GMT) |
commit | 40d37814166380b0fb585f818b446159cfbcec0f (patch) | |
tree | 80082c1713d2e7951b29b928e57ece73d3a4883b | |
parent | d45014b236f5a8707c104bb5b47bbb006e3bd4f3 (diff) | |
download | cpython-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.py | 1 | ||||
-rw-r--r-- | Lib/test/test_coding.py | 21 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Parser/parsetok.c | 2 | ||||
-rw-r--r-- | Parser/pgenmain.c | 7 | ||||
-rw-r--r-- | Parser/tokenizer.c | 5 | ||||
-rw-r--r-- | Python/pythonrun.c | 2 |
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() @@ -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: |