diff options
author | Guido van Rossum <guido@python.org> | 1999-09-07 14:24:05 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1999-09-07 14:24:05 (GMT) |
commit | 65bb328f67ba8b3d835bf8bf211dcee37463d975 (patch) | |
tree | 50ef85cad0fa8556046d6d14eb52dd311e31877e | |
parent | 2d813e514020a9cf74a19e8b4ba0b98996bb24eb (diff) | |
download | cpython-65bb328f67ba8b3d835bf8bf211dcee37463d975.zip cpython-65bb328f67ba8b3d835bf8bf211dcee37463d975.tar.gz cpython-65bb328f67ba8b3d835bf8bf211dcee37463d975.tar.bz2 |
Fixed memory leak in ratecv, in response to PR#72. By Sjoerd Mullender.
-rw-r--r-- | Modules/audioop.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/Modules/audioop.c b/Modules/audioop.c index 76fba98..02a30c6 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -977,7 +977,7 @@ audioop_ratecv(self, args) char *cp, *ncp; int len, size, nchannels, inrate, outrate, weightA, weightB; int chan, d, *prev_i, *cur_i, cur_o; - PyObject *state, *samps, *str, *rv; + PyObject *state, *samps, *str, *rv = NULL; weightA = 1; weightB = 0; @@ -1013,6 +1013,10 @@ audioop_ratecv(self, args) prev_i = (int *) malloc(nchannels * sizeof(int)); cur_i = (int *) malloc(nchannels * sizeof(int)); len /= size * nchannels; /* # of frames */ + if (prev_i == NULL || cur_i == NULL) { + (void) PyErr_NoMemory(); + goto exit; + } if (state == Py_None) { d = -outrate; @@ -1022,22 +1026,22 @@ audioop_ratecv(self, args) if (!PyArg_ParseTuple(state, "iO!;audioop.ratecv: illegal state argument", &d, &PyTuple_Type, &samps)) - return NULL; + goto exit; if (PyTuple_Size(samps) != nchannels) { PyErr_SetString(AudioopError, "illegal state argument"); - return NULL; + goto exit; } for (chan = 0; chan < nchannels; chan++) { if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan), "ii",&prev_i[chan],&cur_i[chan])) - return NULL; + goto exit; } } str = PyString_FromStringAndSize( NULL, size * nchannels * (len * outrate + inrate - 1) / inrate); if (str == NULL) - return NULL; + goto exit; ncp = PyString_AsString(str); for (;;) { @@ -1050,7 +1054,7 @@ audioop_ratecv(self, args) prev_i[chan], cur_i[chan])); if (PyErr_Occurred()) - return NULL; + goto exit; len = ncp - PyString_AsString(str); if (len == 0) { /*don't want to resize to zero length*/ @@ -1058,11 +1062,11 @@ audioop_ratecv(self, args) Py_DECREF(str); str = rv; } else if (_PyString_Resize(&str, len) < 0) - return NULL; + goto exit; rv = Py_BuildValue("(O(iO))", str, d, samps); Py_DECREF(samps); Py_DECREF(str); - return rv; + goto exit; /* return rv */ } for (chan = 0; chan < nchannels; chan++) { prev_i[chan] = cur_i[chan]; @@ -1098,6 +1102,12 @@ audioop_ratecv(self, args) d -= inrate; } } + exit: + if (prev_i != NULL) + free(prev_i); + if (cur_i != NULL) + free(cur_i); + return rv; } static PyObject * |