]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Eliminate double close of file descriptor in manager.c
authorJonathan Rose <jrose@digium.com>
Mon, 5 Mar 2012 18:58:40 +0000 (18:58 +0000)
committerJonathan Rose <jrose@digium.com>
Mon, 5 Mar 2012 18:58:40 +0000 (18:58 +0000)
The process_output function in manager.c attempted to call fclose and close immediately
afterwards. Since fclose implies close, this resulted in a potential double free on file
descriptors. This patch changes that behavior and also adds error checking to fclose and
close depending on which was deemed necessary. Also error messages. Thanks to Rosen
Iliev for pointing out the location of the problem.

(closes issue ASTERISK-18453)
Reported By: Jaco Kroon
Review: https://reviewboard.asterisk.org/r/1793/
........

Merged revisions 358214 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@358215 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/manager.c

index bd1c8f0aeb9a64da58397f4a381e620534a38678..85a524a39d14511acf7e213a9f901f8e675b52c7 100644 (file)
@@ -5842,10 +5842,20 @@ static void process_output(struct mansession *s, struct ast_str **out, struct as
                xml_translate(out, "", params, format);
        }
 
-       fclose(s->f);
-       s->f = NULL;
-       close(s->fd);
-       s->fd = -1;
+       if (s->f) {
+               if (fclose(s->f)) {
+                       ast_log(LOG_ERROR, "fclose() failed: %s\n", strerror(errno));
+               }
+               s->f = NULL;
+               s->fd = -1;
+       } else if (s->fd != -1) {
+               if (close(s->fd)) {
+                       ast_log(LOG_ERROR, "close() failed: %s\n", strerror(errno));
+               }
+               s->fd = -1;
+       } else {
+               ast_log(LOG_ERROR, "process output attempted to close file/file descriptor on mansession without a valid file or file descriptor.\n");
+       }
 }
 
 static int generic_http_callback(struct ast_tcptls_session_instance *ser,