From: Terry Wilson Date: Wed, 16 Mar 2011 19:28:41 +0000 (+0000) Subject: Don't keep trying to write to a closed connection X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=adefcd6cd161c2c234a6643b8c137331dcf544a0;p=thirdparty%2Fasterisk.git Don't keep trying to write to a closed connection See security advisory AST-2011-003. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@310994 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/manager.c b/main/manager.c index 1604770f4f..70b2593c39 100644 --- a/main/manager.c +++ b/main/manager.c @@ -220,6 +220,7 @@ struct mansession { struct mansession_session *session; FILE *f; int fd; + int write_error:1; }; #define NEW_EVENT(m) (AST_LIST_NEXT(m->session->last_ev, eq_next)) @@ -944,11 +945,15 @@ struct ast_variable *astman_get_variables(const struct message *m) */ static int send_string(struct mansession *s, char *string) { - if (s->f) { - return ast_careful_fwrite(s->f, s->fd, string, strlen(string), s->session->writetimeout); - } else { - return ast_careful_fwrite(s->session->f, s->session->fd, string, strlen(string), s->session->writetimeout); + int res; + + if (s->f && (res = ast_careful_fwrite(s->f, s->fd, string, strlen(string), s->session->writetimeout))) { + s->write_error = 1; + } else if ((res = ast_careful_fwrite(s->session->f, s->session->fd, string, strlen(string), s->session->writetimeout))) { + s->write_error = 1; } + + return res; } /*! @@ -3207,7 +3212,7 @@ static void *session_do(void *data) astman_append(&s, "Asterisk Call Manager/%s\r\n", AMI_VERSION); /* welcome prompt */ for (;;) { - if ((res = do_message(&s)) < 0) + if ((res = do_message(&s)) < 0 || s.write_error) break; } /* session is over, explain why and terminate */