summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2014-06-13 05:16:34 +0000
committerRichard Mudgett <rmudgett@digium.com>2014-06-13 05:16:34 +0000
commit13e697f8c05753cf11158c84ace03ea7d25e1551 (patch)
tree0ac60551edd70cf74321f925bea0239f42cf8a03 /main
parent9ec50643832652548a40a13fa86d52120793eb43 (diff)
AST-2014-007: Fix of fix to allow AMI and SIP TCP to send messages.
ASTERISK-23673 #close Reported by: Richard Mudgett Review: https://reviewboard.asterisk.org/r/3617/ ........ Merged revisions 416066 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 416067 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 416070 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@416071 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/http.c3
-rw-r--r--main/manager.c6
-rw-r--r--main/tcptls.c17
3 files changed, 25 insertions, 1 deletions
diff --git a/main/http.c b/main/http.c
index 19b0199c8..7b3a3cee4 100644
--- a/main/http.c
+++ b/main/http.c
@@ -1326,6 +1326,9 @@ static void *httpd_helper_thread(void *data)
flags |= O_NONBLOCK;
fcntl(ser->fd, F_SETFL, flags);
+ /* We can let the stream wait for data to arrive. */
+ ast_tcptls_stream_set_exclusive_input(ser->stream_cookie, 1);
+
ast_tcptls_stream_set_timeout_inactivity(ser->stream_cookie, session_inactivity);
if (!fgets(buf, sizeof(buf), ser->f) || feof(ser->f)) {
diff --git a/main/manager.c b/main/manager.c
index b4c70a0fc..7a7e8903a 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -5907,6 +5907,12 @@ static void *session_do(void *data)
}
ao2_unlock(session);
+ /*
+ * We cannot let the stream exclusively wait for data to arrive.
+ * We have to wake up the task to send async events.
+ */
+ ast_tcptls_stream_set_exclusive_input(ser->stream_cookie, 0);
+
ast_tcptls_stream_set_timeout_sequence(ser->stream_cookie,
ast_tvnow(), authtimeout * 1000);
diff --git a/main/tcptls.c b/main/tcptls.c
index 076f94bae..2288f388e 100644
--- a/main/tcptls.c
+++ b/main/tcptls.c
@@ -77,6 +77,8 @@ struct ast_tcptls_stream {
* feature to work correctly.
*/
int timeout;
+ /*! TRUE if stream can exclusively wait for fd input. */
+ int exclusive_input;
};
void ast_tcptls_stream_set_timeout_disable(struct ast_tcptls_stream *stream)
@@ -102,6 +104,13 @@ void ast_tcptls_stream_set_timeout_sequence(struct ast_tcptls_stream *stream, st
stream->timeout = timeout;
}
+void ast_tcptls_stream_set_exclusive_input(struct ast_tcptls_stream *stream, int exclusive_input)
+{
+ ast_assert(stream != NULL);
+
+ stream->exclusive_input = exclusive_input;
+}
+
/*!
* \internal
* \brief fopencookie()/funopen() stream read function.
@@ -151,6 +160,11 @@ static HOOK_T tcptls_stream_read(void *cookie, char *buf, LEN_T size)
ast_debug(1, "TLS clean shutdown alert reading data\n");
return 0;
case SSL_ERROR_WANT_READ:
+ if (!stream->exclusive_input) {
+ /* We cannot wait for data now. */
+ errno = EAGAIN;
+ return -1;
+ }
while ((ms = ast_remaining_ms(start, stream->timeout))) {
res = ast_wait_for_input(stream->fd, ms);
if (0 < res) {
@@ -202,7 +216,8 @@ static HOOK_T tcptls_stream_read(void *cookie, char *buf, LEN_T size)
for (;;) {
res = read(stream->fd, buf, size);
- if (0 <= res) {
+ if (0 <= res || !stream->exclusive_input) {
+ /* Got data or we cannot wait for it. */
return res;
}
if (errno != EINTR && errno != EAGAIN) {