]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
main/app: Fix leaks.
authorCorey Farrell <git@cfware.com>
Tue, 19 Dec 2017 01:47:54 +0000 (20:47 -0500)
committerCorey Farrell <git@cfware.com>
Tue, 19 Dec 2017 02:36:32 +0000 (20:36 -0600)
* 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

main/app.c

index 04aca2b8c8a5c703db41a3c5f0e5fc5bb2340268..f01d0651347bd4629cd1842795636b43bf52cc37 100644 (file)
@@ -1029,30 +1029,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,
@@ -1351,10 +1363,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) {