Fix reference leaks introduced by the recent incremental codec
changes.
This commit is contained in:
parent
40108c97fb
commit
b9c03e999f
|
@ -758,7 +758,9 @@ encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,
|
|||
datalen, ctx->errors, final ? MBENC_FLUSH : 0);
|
||||
if (r == NULL) {
|
||||
/* recover the original pending buffer */
|
||||
memcpy(ctx->pending, inbuf_tmp, Py_UNICODE_SIZE * origpending);
|
||||
if (origpending > 0)
|
||||
memcpy(ctx->pending, inbuf_tmp,
|
||||
Py_UNICODE_SIZE * origpending);
|
||||
ctx->pendingsize = origpending;
|
||||
goto errorexit;
|
||||
}
|
||||
|
@ -887,17 +889,9 @@ static PyObject *
|
|||
mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
MultibyteIncrementalEncoderObject *self;
|
||||
PyObject *codec;
|
||||
PyObject *codec = NULL;
|
||||
char *errors = NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
return NULL;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalEncoder",
|
||||
incnewkwarglist, &errors))
|
||||
return NULL;
|
||||
|
@ -906,6 +900,14 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
if (self == NULL)
|
||||
return NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
goto errorexit;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
goto errorexit;
|
||||
}
|
||||
|
||||
self->codec = ((MultibyteCodecObject *)codec)->codec;
|
||||
self->pendingsize = 0;
|
||||
self->errors = internal_error_callback(errors);
|
||||
|
@ -915,10 +917,12 @@ mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
self->codec->encinit(&self->state, self->codec->config) != 0)
|
||||
goto errorexit;
|
||||
|
||||
Py_DECREF(codec);
|
||||
return (PyObject *)self;
|
||||
|
||||
errorexit:
|
||||
Py_XDECREF(self);
|
||||
Py_XDECREF(codec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1080,17 +1084,9 @@ static PyObject *
|
|||
mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
MultibyteIncrementalDecoderObject *self;
|
||||
PyObject *codec;
|
||||
PyObject *codec = NULL;
|
||||
char *errors = NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
return NULL;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalDecoder",
|
||||
incnewkwarglist, &errors))
|
||||
return NULL;
|
||||
|
@ -1099,6 +1095,14 @@ mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
if (self == NULL)
|
||||
return NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
goto errorexit;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
goto errorexit;
|
||||
}
|
||||
|
||||
self->codec = ((MultibyteCodecObject *)codec)->codec;
|
||||
self->pendingsize = 0;
|
||||
self->errors = internal_error_callback(errors);
|
||||
|
@ -1108,10 +1112,12 @@ mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
self->codec->decinit(&self->state, self->codec->config) != 0)
|
||||
goto errorexit;
|
||||
|
||||
Py_DECREF(codec);
|
||||
return (PyObject *)self;
|
||||
|
||||
errorexit:
|
||||
Py_XDECREF(self);
|
||||
Py_XDECREF(codec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1381,17 +1387,9 @@ static PyObject *
|
|||
mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
MultibyteStreamReaderObject *self;
|
||||
PyObject *codec, *stream;
|
||||
PyObject *stream, *codec = NULL;
|
||||
char *errors = NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
return NULL;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamReader",
|
||||
streamkwarglist, &stream, &errors))
|
||||
return NULL;
|
||||
|
@ -1400,6 +1398,14 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
if (self == NULL)
|
||||
return NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
goto errorexit;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
goto errorexit;
|
||||
}
|
||||
|
||||
self->codec = ((MultibyteCodecObject *)codec)->codec;
|
||||
self->stream = stream;
|
||||
Py_INCREF(stream);
|
||||
|
@ -1411,10 +1417,12 @@ mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
self->codec->decinit(&self->state, self->codec->config) != 0)
|
||||
goto errorexit;
|
||||
|
||||
Py_DECREF(codec);
|
||||
return (PyObject *)self;
|
||||
|
||||
errorexit:
|
||||
Py_XDECREF(self);
|
||||
Py_XDECREF(codec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1501,6 +1509,7 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,
|
|||
if (wr == NULL)
|
||||
return -1;
|
||||
|
||||
Py_DECREF(wr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1583,17 +1592,9 @@ static PyObject *
|
|||
mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
MultibyteStreamWriterObject *self;
|
||||
PyObject *codec, *stream;
|
||||
PyObject *stream, *codec = NULL;
|
||||
char *errors = NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
return NULL;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamWriter",
|
||||
streamkwarglist, &stream, &errors))
|
||||
return NULL;
|
||||
|
@ -1602,6 +1603,14 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
if (self == NULL)
|
||||
return NULL;
|
||||
|
||||
codec = PyObject_GetAttrString((PyObject *)type, "codec");
|
||||
if (codec == NULL)
|
||||
goto errorexit;
|
||||
if (!MultibyteCodec_Check(codec)) {
|
||||
PyErr_SetString(PyExc_TypeError, "codec is unexpected type");
|
||||
goto errorexit;
|
||||
}
|
||||
|
||||
self->codec = ((MultibyteCodecObject *)codec)->codec;
|
||||
self->stream = stream;
|
||||
Py_INCREF(stream);
|
||||
|
@ -1613,10 +1622,12 @@ mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
self->codec->encinit(&self->state, self->codec->config) != 0)
|
||||
goto errorexit;
|
||||
|
||||
Py_DECREF(codec);
|
||||
return (PyObject *)self;
|
||||
|
||||
errorexit:
|
||||
Py_XDECREF(self);
|
||||
Py_XDECREF(codec);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ typedef struct {
|
|||
#define ERROR_REPLACE (PyObject *)(3)
|
||||
#define ERROR_ISCUSTOM(p) ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
|
||||
#define ERROR_DECREF(p) do { \
|
||||
if (ERROR_ISCUSTOM(p)) { \
|
||||
if (p != NULL && ERROR_ISCUSTOM(p)) { \
|
||||
Py_DECREF(p); \
|
||||
} \
|
||||
} while (0);
|
||||
|
|
Loading…
Reference in New Issue