mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	main/app: Fix leaks.
* ast_linear_stream would leak a file descriptor if it failed to allocate lin. * ast_control_tone leaked zone and ts if ast_playtones_start failed. Additionally added whitespace to ast_linear_stream, pulled assignments out of conditionals for improved readability. Change-Id: I6d1a10cf9161b1529d939b9b2d63ea36d395b657
This commit is contained in:
		
							
								
								
									
										32
									
								
								main/app.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								main/app.c
									
									
									
									
									
								
							| @@ -1027,30 +1027,42 @@ int ast_linear_stream(struct ast_channel *chan, const char *filename, int fd, in | ||||
| { | ||||
| 	struct linear_state *lin; | ||||
| 	char tmpf[256]; | ||||
| 	int res = -1; | ||||
| 	int autoclose = 0; | ||||
|  | ||||
| 	if (fd < 0) { | ||||
| 		if (ast_strlen_zero(filename)) { | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		autoclose = 1; | ||||
|  | ||||
| 		if (filename[0] == '/') { | ||||
| 			ast_copy_string(tmpf, filename, sizeof(tmpf)); | ||||
| 		} else { | ||||
| 			snprintf(tmpf, sizeof(tmpf), "%s/%s/%s", ast_config_AST_DATA_DIR, "sounds", filename); | ||||
| 		} | ||||
| 		if ((fd = open(tmpf, O_RDONLY)) < 0) { | ||||
|  | ||||
| 		fd = open(tmpf, O_RDONLY); | ||||
| 		if (fd < 0) { | ||||
| 			ast_log(LOG_WARNING, "Unable to open file '%s': %s\n", tmpf, strerror(errno)); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| 	if ((lin = ast_calloc(1, sizeof(*lin)))) { | ||||
| 		lin->fd = fd; | ||||
| 		lin->allowoverride = allowoverride; | ||||
| 		lin->autoclose = autoclose; | ||||
| 		res = ast_activate_generator(chan, &linearstream, lin); | ||||
|  | ||||
| 	lin = ast_calloc(1, sizeof(*lin)); | ||||
| 	if (!lin) { | ||||
| 		if (autoclose) { | ||||
| 			close(fd); | ||||
| 		} | ||||
|  | ||||
| 		return -1; | ||||
| 	} | ||||
| 	return res; | ||||
|  | ||||
| 	lin->fd = fd; | ||||
| 	lin->allowoverride = allowoverride; | ||||
| 	lin->autoclose = autoclose; | ||||
|  | ||||
| 	return ast_activate_generator(chan, &linearstream, lin); | ||||
| } | ||||
|  | ||||
| static int control_streamfile(struct ast_channel *chan, | ||||
| @@ -1349,10 +1361,10 @@ int ast_control_tone(struct ast_channel *chan, const char *tone) | ||||
| 	ts = ast_get_indication_tone(zone ? zone : ast_channel_zone(chan), tone_indication); | ||||
|  | ||||
| 	if (ast_playtones_start(chan, 0, ts ? ts->data : tone_indication, 0)) { | ||||
| 		return -1; | ||||
| 		res = -1; | ||||
| 	} | ||||
|  | ||||
| 	for (;;) { | ||||
| 	while (!res) { | ||||
| 		struct ast_frame *fr; | ||||
|  | ||||
| 		if (ast_waitfor(chan, -1) < 0) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user