Avoid transitioning into SSL_ST_OK and back out.
I doubt this matters, but this seems a little odd. In particular, this
avoids info_callback seeing the SSL_ST_OK once we stop switching
hs->state back and forth.
BUG=177
Change-Id: Ied39c0e94c242af9d5d0f26795d6e0f2f0b12406
Reviewed-on: https://boringssl-review.googlesource.com/13827
Reviewed-by: Steven Valdez <svaldez@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/handshake_client.c b/ssl/handshake_client.c
index 427213c..61efd5c 100644
--- a/ssl/handshake_client.c
+++ b/ssl/handshake_client.c
@@ -393,7 +393,7 @@
hs->state = SSL3_ST_CW_FLUSH;
if (ssl->session != NULL) {
- hs->next_state = SSL_ST_OK;
+ hs->next_state = SSL3_ST_FINISH_CLIENT_HANDSHAKE;
} else {
/* This is a non-resumption handshake. If it involves ChannelID, then
* record the handshake hashes at this point in the session so that
@@ -456,7 +456,7 @@
if (ssl->session != NULL) {
hs->state = SSL3_ST_CW_CHANGE;
} else {
- hs->state = SSL_ST_OK;
+ hs->state = SSL3_ST_FINISH_CLIENT_HANDSHAKE;
}
break;
@@ -466,7 +466,7 @@
goto end;
}
hs->state = hs->next_state;
- if (hs->state != SSL_ST_OK) {
+ if (hs->state != SSL3_ST_FINISH_CLIENT_HANDSHAKE) {
ssl->method->expect_flight(ssl);
}
break;
@@ -476,10 +476,10 @@
if (ret <= 0) {
goto end;
}
- hs->state = SSL_ST_OK;
+ hs->state = SSL3_ST_FINISH_CLIENT_HANDSHAKE;
break;
- case SSL_ST_OK:
+ case SSL3_ST_FINISH_CLIENT_HANDSHAKE:
ssl->method->release_current_message(ssl, 1 /* free_buffer */);
SSL_SESSION_free(ssl->s3->established_session);
@@ -493,10 +493,6 @@
ssl->s3->established_session =
SSL_SESSION_dup(ssl->s3->new_session, SSL_SESSION_DUP_ALL);
if (ssl->s3->established_session == NULL) {
- /* Do not stay in SSL_ST_OK, to avoid confusing |SSL_in_init|
- * callers. */
- hs->state = SSL_ST_ERROR;
- skip = 1;
ret = -1;
goto end;
}
@@ -506,6 +502,10 @@
ssl->s3->new_session = NULL;
}
+ hs->state = SSL_ST_OK;
+ break;
+
+ case SSL_ST_OK: {
const int is_initial_handshake = !ssl->s3->initial_handshake_complete;
ssl->s3->initial_handshake_complete = 1;
if (is_initial_handshake) {
@@ -516,11 +516,7 @@
ret = 1;
ssl_do_info_callback(ssl, SSL_CB_HANDSHAKE_DONE, 1);
goto end;
-
- case SSL_ST_ERROR:
- OPENSSL_PUT_ERROR(SSL, SSL_R_SSL_HANDSHAKE_FAILURE);
- ret = -1;
- goto end;
+ }
default:
OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_STATE);