]> granicus.if.org Git - python/commitdiff
Fix reference leaks introduced by the recent incremental codec
authorHye-Shik Chang <hyeshik@gmail.com>
Mon, 27 Mar 2006 08:24:54 +0000 (08:24 +0000)
committerHye-Shik Chang <hyeshik@gmail.com>
Mon, 27 Mar 2006 08:24:54 +0000 (08:24 +0000)
changes.

Modules/cjkcodecs/multibytecodec.c
Modules/cjkcodecs/multibytecodec.h

index 6e5c5878143def9288677ca3c2dde365b1bbe724..73689ef8e4b576af9b62ec0f9a4c55206607d699 100644 (file)
@@ -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;
 }
 
index 671ecaee94ecefcdc88a384c379fe36aee29cdba..22ea5d4abfce1e0cea2b485a67b8b7b44c2ef698 100644 (file)
@@ -123,10 +123,10 @@ typedef struct {
 #define ERROR_IGNORE           (PyObject *)(2)
 #define ERROR_REPLACE          (PyObject *)(3)
 #define ERROR_ISCUSTOM(p)      ((p) < ERROR_STRICT || ERROR_REPLACE < (p))
-#define ERROR_DECREF(p) do {           \
-       if (ERROR_ISCUSTOM(p)) {        \
-               Py_DECREF(p);           \
-       }                               \
+#define ERROR_DECREF(p) do {                   \
+       if (p != NULL && ERROR_ISCUSTOM(p)) {   \
+               Py_DECREF(p);                   \
+       }                                       \
 } while (0);
 
 #define MBENC_FLUSH            0x0001 /* encode all characters encodable */