From 79799266165b5d8d4e8b9b007d81ba3b00197ca9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 9 Jul 2013 00:35:22 +0200 Subject: [PATCH] Issue #18408: Fix usage of _PyBytes_Resize() _PyBytes_Resize(&v, new_size) sets v to NULL on error, so v cannot be used anymore. Replace "Py_DECREF(v); v = NULL;" with "Py_CLEAR(v);". --- Modules/binascii.c | 23 ++++++++--------------- Modules/zlibmodule.c | 24 ++++++++---------------- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/Modules/binascii.c b/Modules/binascii.c index 340ec9c4260..386c2deefd5 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -361,8 +361,7 @@ binascii_b2a_uu(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (ascii_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } PyBuffer_Release(&pbin); return rv; @@ -491,8 +490,7 @@ binascii_a2b_base64(PyObject *self, PyObject *args) */ if (bin_len > 0) { if (_PyBytes_Resize(&rv, bin_len) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } } else { @@ -563,8 +561,7 @@ binascii_b2a_base64(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (ascii_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } PyBuffer_Release(&pbuf); return rv; @@ -642,8 +639,7 @@ binascii_a2b_hqx(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (bin_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } if (rv) { PyObject *rrv = Py_BuildValue("Oi", rv, done); @@ -713,8 +709,7 @@ binascii_rlecode_hqx(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (out_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } PyBuffer_Release(&pbuf); return rv; @@ -770,8 +765,7 @@ binascii_b2a_hqx(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (ascii_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } PyBuffer_Release(&pbin); return rv; @@ -834,7 +828,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) if ( --out_len_left < 0 ) { \ if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \ if (_PyBytes_Resize(&rv, 2*out_len) < 0) \ - { Py_DECREF(rv); PyBuffer_Release(&pin); return NULL; } \ + { Py_XDECREF(rv); PyBuffer_Release(&pin); return NULL; } \ out_data = (unsigned char *)PyBytes_AS_STRING(rv) \ + out_len; \ out_len_left = out_len-1; \ @@ -887,8 +881,7 @@ binascii_rledecode_hqx(PyObject *self, PyObject *args) if (_PyBytes_Resize(&rv, (out_data - (unsigned char *)PyBytes_AS_STRING(rv))) < 0) { - Py_DECREF(rv); - rv = NULL; + Py_CLEAR(rv); } PyBuffer_Release(&pin); return rv; diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index da0d3db5c66..169903e7ea9 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -549,8 +549,7 @@ PyZlib_objcompress(compobject *self, PyObject *args) so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { if (_PyBytes_Resize(&RetVal, length << 1) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); goto error; } self->zst.next_out = @@ -574,8 +573,7 @@ PyZlib_objcompress(compobject *self, PyObject *args) goto error; } if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); } error: @@ -722,8 +720,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) length = max_length; if (_PyBytes_Resize(&RetVal, length) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); goto error; } self->zst.next_out = @@ -757,8 +754,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args) } if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); } error: @@ -811,8 +807,7 @@ PyZlib_flush(compobject *self, PyObject *args) so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { if (_PyBytes_Resize(&RetVal, length << 1) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); goto error; } self->zst.next_out = @@ -851,8 +846,7 @@ PyZlib_flush(compobject *self, PyObject *args) } if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) { - Py_DECREF(RetVal); - RetVal = NULL; + Py_CLEAR(RetVal); } error: @@ -1012,8 +1006,7 @@ PyZlib_unflush(compobject *self, PyObject *args) so extend the output buffer and try again */ while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) { if (_PyBytes_Resize(&retval, length << 1) < 0) { - Py_DECREF(retval); - retval = NULL; + Py_CLEAR(retval); goto error; } self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length; @@ -1045,8 +1038,7 @@ PyZlib_unflush(compobject *self, PyObject *args) } if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) { - Py_DECREF(retval); - retval = NULL; + Py_CLEAR(retval); } error: