diff options
author | Mark Michelson <mmichelson@digium.com> | 2012-10-12 16:31:01 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2012-10-12 16:31:01 +0000 |
commit | c7b23cbb0af1928014cb283c511b9dec48488163 (patch) | |
tree | b9d0286502a98f9fdffbbd94c4150f616ddef54b /include | |
parent | 399428224d0a4d22b401fc228056ced705c07bdd (diff) |
Do not use a FILE handle when doing SIP TCP reads.
This is used to solve an issue where a poll on a file
descriptor does not necessarily correspond to the readiness
of a FILE handle to be read.
This change makes it so that for TCP connections, we do a
recv() on the file descriptor instead.
Because TCP does not guarantee that an entire message or even
just one single message will arrive during a read, a loop has
been introduced to ensure that we only attempt to handle a
single message at a time. The tcptls_session_instance structure
has also had an overflow buffer added to it so that if more
than one TCP message arrives in one go, there is a place to
throw the excess.
Huge thanks goes out to Walter Doekes for doing extensive review
on this change and finding edge cases where code could fail.
(closes issue ASTERISK-20212)
reported by Phil Ciccone
Review: https://reviewboard.asterisk.org/r/2123
........
Merged revisions 374905 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 374906 from http://svn.asterisk.org/svn/asterisk/branches/10
........
Merged revisions 374914 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374924 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/tcptls.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/asterisk/tcptls.h b/include/asterisk/tcptls.h index 6d8d14993..6364158de 100644 --- a/include/asterisk/tcptls.h +++ b/include/asterisk/tcptls.h @@ -155,6 +155,12 @@ struct ast_tcptls_session_instance { int client; struct ast_sockaddr remote_address; struct ast_tcptls_session_args *parent; + /* Sometimes, when an entity reads TCP data, multiple + * logical messages might be read at the same time. In such + * a circumstance, there needs to be a place to stash the + * extra data. + */ + struct ast_str *overflow_buf; }; #if defined(HAVE_FUNOPEN) |