diff options
author | Benjamin Peterson <benjamin@python.org> | 2014-10-06 21:11:25 -0400 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2014-10-06 21:11:25 -0400 |
commit | 9c06648ea3157945a37a3b38e35d71c948b998dd (patch) | |
tree | 6bc2c56520ecad5d30a8b5bbfcc2c05191cfc43f /Python/codecs.c | |
parent | 1c41575d9be1e2bcce4916ed170fceacf456dd65 (diff) | |
parent | 9d2ec0c84470eb9fdec4fe87cb223a425370e6c3 (diff) | |
download | cpython-9c06648ea3157945a37a3b38e35d71c948b998dd.tar.gz |
merge 3.4
Diffstat (limited to 'Python/codecs.c')
-rw-r--r-- | Python/codecs.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/Python/codecs.c b/Python/codecs.c index 6849c0f9a4..151fea7d49 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -933,6 +933,7 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) } } +#define ENC_UNKNOWN -1 #define ENC_UTF8 0 #define ENC_UTF16BE 1 #define ENC_UTF16LE 2 @@ -948,7 +949,11 @@ get_standard_encoding(const char *encoding, int *bytelength) encoding += 3; if (*encoding == '-' || *encoding == '_' ) encoding++; - if (encoding[0] == '1' && encoding[1] == '6') { + if (encoding[0] == '8' && encoding[1] == '\0') { + *bytelength = 3; + return ENC_UTF8; + } + else if (encoding[0] == '1' && encoding[1] == '6') { encoding += 2; *bytelength = 2; if (*encoding == '\0') { @@ -987,9 +992,11 @@ get_standard_encoding(const char *encoding, int *bytelength) } } } - /* utf-8 */ - *bytelength = 3; - return ENC_UTF8; + else if (strcmp(encoding, "CP_UTF8") == 0) { + *bytelength = 3; + return ENC_UTF8; + } + return ENC_UNKNOWN; } /* This handler is declared static until someone demonstrates @@ -1026,6 +1033,12 @@ PyCodec_SurrogatePassErrors(PyObject *exc) } code = get_standard_encoding(encoding, &bytelength); Py_DECREF(encode); + if (code == ENC_UNKNOWN) { + /* Not supported, fail with original exception */ + PyErr_SetObject(PyExceptionInstance_Class(exc), exc); + Py_DECREF(object); + return NULL; + } if (end - start > PY_SSIZE_T_MAX / bytelength) end = start + PY_SSIZE_T_MAX / bytelength; @@ -1102,6 +1115,12 @@ PyCodec_SurrogatePassErrors(PyObject *exc) } code = get_standard_encoding(encoding, &bytelength); Py_DECREF(encode); + if (code == ENC_UNKNOWN) { + /* Not supported, fail with original exception */ + PyErr_SetObject(PyExceptionInstance_Class(exc), exc); + Py_DECREF(object); + return NULL; + } /* Try decoding a single surrogate character. If there are more, let the codec call us again. */ |