diff options
author | Corey Farrell <git@cfware.com> | 2014-11-02 08:12:06 +0000 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2014-11-02 08:12:06 +0000 |
commit | 5f17490f4d3101e674193ebafd6bd7a052a7c8d5 (patch) | |
tree | 8d8db16cb2f2866c6479722a08810b00138d3126 /main/app.c | |
parent | 54460c74e4a2c6226389a4e99f4731d5c4076627 (diff) |
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/
........
Merged revisions 427023 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 427024 from http://svn.asterisk.org/svn/asterisk/branches/11
........
Merged revisions 427025 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@427026 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/app.c')
-rw-r--r-- | main/app.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/main/app.c b/main/app.c index a6c7514cd..64a4ae672 100644 --- a/main/app.c +++ b/main/app.c @@ -1782,18 +1782,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 (prepend && 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[0]); + continue; + } /*!\note Same logic as above. */ if (dspsilence) { ast_stream_rewind(others[x], dspsilence - 200); @@ -1810,7 +1812,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_format_get_name(rfmt), ast_channel_name(chan)); } |