aboutsummaryrefslogtreecommitdiffstats
path: root/ssl
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-05-12 17:18:32 +0100
committerMatt Caswell <matt@openssl.org>2016-05-20 14:39:07 +0100
commit1689e7e688b3b0ae492932b07f2626f8a4e1e664 (patch)
tree6d9d13c594205049d78c417bff24b2d2a7be0eea /ssl
parent1257adecd4afba978806b77bd5d45f32715d97d3 (diff)
downloadopenssl-1689e7e688b3b0ae492932b07f2626f8a4e1e664.tar.gz
Ensure async IO works with new state machine
In the new state machine if using nbio and we get the header of a handshake message is one record with the body in the next, with an nbio event in the middle, then the connection was failing. This is because s->init_num was getting reset. We should only reset it after we have read the whole message. RT#4394 Reviewed-by: Andy Polyakov <appro@openssl.org>
Diffstat (limited to 'ssl')
-rw-r--r--ssl/statem/statem.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/ssl/statem/statem.c b/ssl/statem/statem.c
index 20353c305b..0b0595d237 100644
--- a/ssl/statem/statem.c
+++ b/ssl/statem/statem.c
@@ -500,7 +500,6 @@ static SUB_STATE_RETURN read_state_machine(SSL *s) {
while(1) {
switch(st->read_state) {
case READ_STATE_HEADER:
- s->init_num = 0;
/* Get the state the peer wants to move to */
if (SSL_IS_DTLS(s)) {
/*
@@ -559,6 +558,10 @@ static SUB_STATE_RETURN read_state_machine(SSL *s) {
return SUB_STATE_ERROR;
}
ret = process_message(s, &pkt);
+
+ /* Discard the packet data */
+ s->init_num = 0;
+
if (ret == MSG_PROCESS_ERROR) {
return SUB_STATE_ERROR;
}