summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2012-03-05 19:06:46 +0000
committerJonathan Rose <jrose@digium.com>2012-03-05 19:06:46 +0000
commit11bbc097b7d6e115ea413dd80b8deee95ee3dc63 (patch)
tree2636cfba4770e5235066c0bb10ae9043b6b8e432
parent2736fe9917dfbcb3123b7c2b7e2f10ac9904a3c6 (diff)
Eliminate double close of file descriptor in manager.c
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 ........ Merged revisions 358215 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@358216 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--main/manager.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/main/manager.c b/main/manager.c
index bafe827d7..482496dca 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -5852,10 +5852,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,