mirror of https://github.com/python/cpython
- 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:
parent
d45014b236
commit
40d3781416
|
@ -0,0 +1 @@
|
||||||
|
# -*- coding: uft-8 -*-
|
|
@ -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
|
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
|
- All iterators now have a Boolean value of true. Formerly, some iterators
|
||||||
supported a __len__() method which evaluated to False when the iterator
|
supported a __len__() method which evaluated to False when the iterator
|
||||||
was empty.
|
was empty.
|
||||||
|
|
|
@ -42,7 +42,7 @@ PyParser_ParseStringFlagsFilename(const char *s, const char *filename,
|
||||||
initerr(err_ret, filename);
|
initerr(err_ret, filename);
|
||||||
|
|
||||||
if ((tok = PyTokenizer_FromString(s)) == NULL) {
|
if ((tok = PyTokenizer_FromString(s)) == NULL) {
|
||||||
err_ret->error = E_NOMEM;
|
err_ret->error = PyErr_Occurred() ? E_DECODE : E_NOMEM;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,6 +116,13 @@ getgrammar(char *filename)
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Can't happen in pgen */
|
||||||
|
PyObject*
|
||||||
|
PyErr_Occurred()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Py_FatalError(const char *msg)
|
Py_FatalError(const char *msg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -603,8 +603,11 @@ decode_str(const char *str, struct tok_state *tok)
|
||||||
if (tok->enc != NULL) {
|
if (tok->enc != NULL) {
|
||||||
assert(utf8 == NULL);
|
assert(utf8 == NULL);
|
||||||
utf8 = translate_into_utf8(str, tok->enc);
|
utf8 = translate_into_utf8(str, tok->enc);
|
||||||
if (utf8 == NULL)
|
if (utf8 == NULL) {
|
||||||
|
PyErr_Format(PyExc_SyntaxError,
|
||||||
|
"unknown encoding: %s", tok->enc);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
str = PyString_AsString(utf8);
|
str = PyString_AsString(utf8);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1487,7 +1487,7 @@ err_input(perrdetail *err)
|
||||||
msg = "unknown decode error";
|
msg = "unknown decode error";
|
||||||
Py_DECREF(type);
|
Py_DECREF(type);
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
Py_DECREF(tb);
|
Py_XDECREF(tb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case E_LINECONT:
|
case E_LINECONT:
|
||||||
|
|
Loading…
Reference in New Issue