Fix ast_writestream leaks

Fix cleanup in __ast_play_and_record where others[x] may be leaked.
This was caught where prepend != NULL && outmsg != NULL, once
realfile[x] == NULL any further others[x] would be leaked. A cleanup
block was also added for prepend != NULL && outmsg == NULL.

11+: Fix leak of ast_writestream recording_fs in
app_voicemail:leave_voicemail.

ASTERISK-24476 #close
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/4138/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@427023 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/76/76/1
Corey Farrell 11 years ago
parent 27113c09dc
commit 37cd8a830b

@ -1121,18 +1121,20 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile,
ast_truncstream(others[x]);
ast_closestream(others[x]);
}
}
if (prepend && outmsg) {
} else if (outmsg) {
struct ast_filestream *realfiles[AST_MAX_FORMATS];
struct ast_frame *fr;
for (x = 0; x < fmtcnt; x++) {
snprintf(comment, sizeof(comment), "Opening the real file %s.%s\n", recordfile, sfmt[x]);
realfiles[x] = ast_readfile(recordfile, sfmt[x], comment, O_RDONLY, 0, 0);
if (!others[x] || !realfiles[x]) {
if (!others[x]) {
break;
}
if (!realfiles[x]) {
ast_closestream(others[x]);
continue;
}
/*!\note Same logic as above. */
if (dspsilence) {
ast_stream_rewind(others[x], dspsilence - 200);
@ -1149,7 +1151,15 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile,
ast_verb(4, "Recording Format: sfmts=%s, prependfile %s, recordfile %s\n", sfmt[x], prependfile, recordfile);
ast_filedelete(prependfile, sfmt[x]);
}
} else {
for (x = 0; x < fmtcnt; x++) {
if (!others[x]) {
break;
}
ast_closestream(others[x]);
}
}
if (rfmt && ast_set_read_format(chan, rfmt)) {
ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
}

Loading…
Cancel
Save