mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	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 ........ Merged revisions 427026 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@427027 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		@@ -6158,6 +6158,7 @@ static int msg_create_from_file(struct ast_vm_recording_data *recdata)
 | 
			
		||||
				ast_log(LOG_ERROR,"Unable to determine sample rate of recording %s\n", recdata->recording_file);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ast_closeframe(recording_fs);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If the duration was below the minimum duration for the user, let's just drop the whole thing now */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								main/app.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								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));
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user