Skip to content

Commit

Permalink
Enable SSL_MODE_AUTO_RETRY by default
Browse files Browse the repository at this point in the history
Because TLS 1.3 sends more non-application data records some clients run
into problems because they don't expect SSL_read() to return and set
SSL_ERROR_WANT_READ after processing it.

This can cause problems for clients that use blocking I/O and use
select() to see if data is available. It can be cleared using
SSL_CTX_clear_mode().

Reviewed-by: Matt Caswell <matt@openssl.org>
GH: #6260
  • Loading branch information
kroeckx committed May 22, 2018
1 parent 1aac20f commit 693cf80
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 9 deletions.
11 changes: 11 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@

Changes between 1.1.0h and 1.1.1 [xx XXX xxxx]

*) SSL_MODE_AUTO_RETRY is enabled by default. Applications that use blocking
I/O in combination with something like select() or poll() will hang. This
can be turned off again using SSL_CTX_clear_mode().
Many applications do not properly handle non-application data records, and
TLS 1.3 sends more of such records. Setting SSL_MODE_AUTO_RETRY works
around the problems in those applications, but can also break some.
It's recommended to read the manpages about SSL_read(), SSL_write(),
SSL_get_error(), SSL_shutdown(), SSL_CTX_set_mode() and
SSL_CTX_set_read_ahead() again.
[Kurt Roeckx]

*) When unlocking a pass phrase protected PEM file or PKCS#8 container, we
now allow empty (zero character) pass phrases.
[Richard Levitte]
Expand Down
2 changes: 2 additions & 0 deletions apps/s_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1675,6 +1675,8 @@ int s_client_main(int argc, char **argv)
goto end;
}

SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY);

if (sdebug)
ssl_ctx_security_debug(ctx, sdebug);

Expand Down
3 changes: 3 additions & 0 deletions apps/s_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1753,6 +1753,9 @@ int s_server_main(int argc, char *argv[])
ERR_print_errors(bio_err);
goto end;
}

SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY);

if (sdebug)
ssl_ctx_security_debug(ctx, sdebug);

Expand Down
1 change: 1 addition & 0 deletions ssl/ssl_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -2896,6 +2896,7 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth)
ret->method = meth;
ret->min_proto_version = 0;
ret->max_proto_version = 0;
ret->mode = SSL_MODE_AUTO_RETRY;
ret->session_cache_mode = SSL_SESS_CACHE_SERVER;
ret->session_cache_size = SSL_SESSION_CACHE_MAX_SIZE_DEFAULT;
/* We take the system default. */
Expand Down
9 changes: 0 additions & 9 deletions test/sslapitest.c
Original file line number Diff line number Diff line change
Expand Up @@ -2351,15 +2351,6 @@ static int test_early_data_not_sent(int idx)
|| !TEST_size_t_eq(written, strlen(MSG2)))
goto end;

/*
* Should block due to the NewSessionTicket arrival unless we're using
* read_ahead, or PSKs
*/
if (idx != 1 && idx != 2) {
if (!TEST_false(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes)))
goto end;
}

if (!TEST_true(SSL_read_ex(clientssl, buf, sizeof(buf), &readbytes))
|| !TEST_mem_eq(buf, readbytes, MSG2, strlen(MSG2)))
goto end;
Expand Down

0 comments on commit 693cf80

Please sign in to comment.