Fix reference leaks introduced by the recent incremental codec
changes.
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 6e5c587..73689ef 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -758,7 +758,9 @@
 			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 @@
 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 @@
 	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 @@
 	    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 @@
 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 @@
 	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 @@
 	    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 @@
 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 @@
 	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 @@
 	    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 @@
 	if (wr == NULL)
 		return -1;
 
+	Py_DECREF(wr);
 	return 0;
 }
 
@@ -1583,17 +1592,9 @@
 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 @@
 	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 @@
 	    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;
 }
 
diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h
index 671ecae..22ea5d4 100644
--- a/Modules/cjkcodecs/multibytecodec.h
+++ b/Modules/cjkcodecs/multibytecodec.h
@@ -123,10 +123,10 @@
 #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 */