diff options
author | Richard Mudgett <rmudgett@digium.com> | 2014-06-13 05:16:34 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2014-06-13 05:16:34 +0000 |
commit | 13e697f8c05753cf11158c84ace03ea7d25e1551 (patch) | |
tree | 0ac60551edd70cf74321f925bea0239f42cf8a03 /main/tcptls.c | |
parent | 9ec50643832652548a40a13fa86d52120793eb43 (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/tcptls.c')
-rw-r--r-- | main/tcptls.c | 17 |
1 files changed, 16 insertions, 1 deletions
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) { |