diff options
author | George Joseph <gjoseph@digium.com> | 2017-12-19 14:19:42 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-12-19 14:19:42 -0600 |
commit | 88f7f4ebb641c22de9bab5e62323f6b536431104 (patch) | |
tree | 715f958532bceeb26ebaa00f9914f4048c613e2e | |
parent | 5554bc6b530cd8470e6cbba4d551a346cca1f1f9 (diff) | |
parent | 8dfc973d6437dd5ef7e3d62dd4d167be8e2e96af (diff) |
Merge "main/app: Fix leaks."
-rw-r--r-- | main/app.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/main/app.c b/main/app.c index f35c4b7d2..bdf243cdd 100644 --- a/main/app.c +++ b/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) { |