- 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.
This commit is contained in:
Neal Norwitz 2005-10-02 01:48:49 +00:00
parent d45014b236
commit 40d3781416
7 changed files with 39 additions and 3 deletions

1
Lib/test/bad_coding.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: uft-8 -*-

21
Lib/test/test_coding.py Normal file
View File

@ -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()

View File

@ -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.

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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

View File

@ -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: