aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Thorne <libcthorne@users.noreply.github.com>2018-11-02 03:29:40 +0000
committerINADA Naoki <methane@users.noreply.github.com>2018-11-02 12:29:40 +0900
commit488c0a6cdf09e21774e63c2a430ecc0de804d147 (patch)
tree2bcddc07c0880a2a9ec20edaddae469bce743287 /Modules/cjkcodecs
parentcloses bpo-35139: The `pyexpat` module's macros in `Modules/Setup` now match ... (diff)
downloadcpython-488c0a6cdf09e21774e63c2a430ecc0de804d147.tar.gz
cpython-488c0a6cdf09e21774e63c2a430ecc0de804d147.tar.bz2
cpython-488c0a6cdf09e21774e63c2a430ecc0de804d147.zip
bpo-33578: Fix getstate/setstate for CJK decoder (GH-10290)
Previous version was casting to Py_ssize_t incorrectly and exhibited unexpected behavior on big-endian systems.
Diffstat (limited to 'Modules/cjkcodecs')
-rw-r--r--Modules/cjkcodecs/multibytecodec.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 4633499a8ab..9409456c0d2 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -1218,6 +1218,7 @@ _multibytecodec_MultibyteIncrementalDecoder_getstate_impl(MultibyteIncrementalDe
/*[clinic end generated code: output=255009c4713b7f82 input=4006aa49bddbaa75]*/
{
PyObject *buffer;
+ PyObject *statelong;
buffer = PyBytes_FromStringAndSize((const char *)self->pending,
self->pendingsize);
@@ -1225,7 +1226,16 @@ _multibytecodec_MultibyteIncrementalDecoder_getstate_impl(MultibyteIncrementalDe
return NULL;
}
- return make_tuple(buffer, (Py_ssize_t)*self->state.c);
+ statelong = (PyObject *)_PyLong_FromByteArray(self->state.c,
+ sizeof(self->state.c),
+ 1 /* little-endian */ ,
+ 0 /* unsigned */ );
+ if (statelong == NULL) {
+ Py_DECREF(buffer);
+ return NULL;
+ }
+
+ return Py_BuildValue("NN", buffer, statelong);
}
/*[clinic input]
@@ -1240,16 +1250,23 @@ _multibytecodec_MultibyteIncrementalDecoder_setstate_impl(MultibyteIncrementalDe
/*[clinic end generated code: output=106b2fbca3e2dcc2 input=e5d794e8baba1a47]*/
{
PyObject *buffer;
+ PyLongObject *statelong;
Py_ssize_t buffersize;
char *bufferstr;
- unsigned long long flag;
+ unsigned char statebytes[8];
- if (!PyArg_ParseTuple(state, "SK;setstate(): illegal state argument",
- &buffer, &flag))
+ if (!PyArg_ParseTuple(state, "SO!;setstate(): illegal state argument",
+ &buffer, &PyLong_Type, &statelong))
{
return NULL;
}
+ if (_PyLong_AsByteArray(statelong, statebytes, sizeof(statebytes),
+ 1 /* little-endian */ ,
+ 0 /* unsigned */ ) < 0) {
+ return NULL;
+ }
+
buffersize = PyBytes_Size(buffer);
if (buffersize == -1) {
return NULL;
@@ -1266,7 +1283,7 @@ _multibytecodec_MultibyteIncrementalDecoder_setstate_impl(MultibyteIncrementalDe
}
self->pendingsize = buffersize;
memcpy(self->pending, bufferstr, self->pendingsize);
- memcpy(self->state.c, (unsigned char *)&flag, sizeof(flag));
+ memcpy(self->state.c, statebytes, sizeof(statebytes));
Py_RETURN_NONE;
}