Fixed memory leak in ratecv, in response to PR#72. By Sjoerd Mullender.

This commit is contained in:
Guido van Rossum 1999-09-07 14:24:05 +00:00
parent 2d813e5140
commit 65bb328f67
1 changed files with 18 additions and 8 deletions

View File

@ -977,7 +977,7 @@ audioop_ratecv(self, args)
char *cp, *ncp; char *cp, *ncp;
int len, size, nchannels, inrate, outrate, weightA, weightB; int len, size, nchannels, inrate, outrate, weightA, weightB;
int chan, d, *prev_i, *cur_i, cur_o; int chan, d, *prev_i, *cur_i, cur_o;
PyObject *state, *samps, *str, *rv; PyObject *state, *samps, *str, *rv = NULL;
weightA = 1; weightA = 1;
weightB = 0; weightB = 0;
@ -1013,6 +1013,10 @@ audioop_ratecv(self, args)
prev_i = (int *) malloc(nchannels * sizeof(int)); prev_i = (int *) malloc(nchannels * sizeof(int));
cur_i = (int *) malloc(nchannels * sizeof(int)); cur_i = (int *) malloc(nchannels * sizeof(int));
len /= size * nchannels; /* # of frames */ len /= size * nchannels; /* # of frames */
if (prev_i == NULL || cur_i == NULL) {
(void) PyErr_NoMemory();
goto exit;
}
if (state == Py_None) { if (state == Py_None) {
d = -outrate; d = -outrate;
@ -1022,22 +1026,22 @@ audioop_ratecv(self, args)
if (!PyArg_ParseTuple(state, if (!PyArg_ParseTuple(state,
"iO!;audioop.ratecv: illegal state argument", "iO!;audioop.ratecv: illegal state argument",
&d, &PyTuple_Type, &samps)) &d, &PyTuple_Type, &samps))
return NULL; goto exit;
if (PyTuple_Size(samps) != nchannels) { if (PyTuple_Size(samps) != nchannels) {
PyErr_SetString(AudioopError, PyErr_SetString(AudioopError,
"illegal state argument"); "illegal state argument");
return NULL; goto exit;
} }
for (chan = 0; chan < nchannels; chan++) { for (chan = 0; chan < nchannels; chan++) {
if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan), if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
"ii",&prev_i[chan],&cur_i[chan])) "ii",&prev_i[chan],&cur_i[chan]))
return NULL; goto exit;
} }
} }
str = PyString_FromStringAndSize( str = PyString_FromStringAndSize(
NULL, size * nchannels * (len * outrate + inrate - 1) / inrate); NULL, size * nchannels * (len * outrate + inrate - 1) / inrate);
if (str == NULL) if (str == NULL)
return NULL; goto exit;
ncp = PyString_AsString(str); ncp = PyString_AsString(str);
for (;;) { for (;;) {
@ -1050,7 +1054,7 @@ audioop_ratecv(self, args)
prev_i[chan], prev_i[chan],
cur_i[chan])); cur_i[chan]));
if (PyErr_Occurred()) if (PyErr_Occurred())
return NULL; goto exit;
len = ncp - PyString_AsString(str); len = ncp - PyString_AsString(str);
if (len == 0) { if (len == 0) {
/*don't want to resize to zero length*/ /*don't want to resize to zero length*/
@ -1058,11 +1062,11 @@ audioop_ratecv(self, args)
Py_DECREF(str); Py_DECREF(str);
str = rv; str = rv;
} else if (_PyString_Resize(&str, len) < 0) } else if (_PyString_Resize(&str, len) < 0)
return NULL; goto exit;
rv = Py_BuildValue("(O(iO))", str, d, samps); rv = Py_BuildValue("(O(iO))", str, d, samps);
Py_DECREF(samps); Py_DECREF(samps);
Py_DECREF(str); Py_DECREF(str);
return rv; goto exit; /* return rv */
} }
for (chan = 0; chan < nchannels; chan++) { for (chan = 0; chan < nchannels; chan++) {
prev_i[chan] = cur_i[chan]; prev_i[chan] = cur_i[chan];
@ -1098,6 +1102,12 @@ audioop_ratecv(self, args)
d -= inrate; d -= inrate;
} }
} }
exit:
if (prev_i != NULL)
free(prev_i);
if (cur_i != NULL)
free(cur_i);
return rv;
} }
static PyObject * static PyObject *