diff options
| author | jsing <> | 2017-01-26 12:56:37 +0000 |
|---|---|---|
| committer | jsing <> | 2017-01-26 12:56:37 +0000 |
| commit | b67df6aca845e645c0b047549941d37e2e1cdaab (patch) | |
| tree | b6f097154c11d0ef88cefdbed8094e57584a2602 | |
| parent | b9490e0dcad175f62fde5ac9eb2403dac2b274c6 (diff) | |
| download | openbsd-b67df6aca845e645c0b047549941d37e2e1cdaab.tar.gz openbsd-b67df6aca845e645c0b047549941d37e2e1cdaab.tar.bz2 openbsd-b67df6aca845e645c0b047549941d37e2e1cdaab.zip | |
Use a flag to track when we need to call SSL_shutdown(). This avoids an
issue where by calling tls_close() on a TLS context that has not attempted
a handshake, results in an unexpected failure.
Reported by Vinay Sajip.
ok beck@
| -rw-r--r-- | src/lib/libtls/tls.c | 5 | ||||
| -rw-r--r-- | src/lib/libtls/tls_client.c | 4 | ||||
| -rw-r--r-- | src/lib/libtls/tls_internal.h | 3 | ||||
| -rw-r--r-- | src/lib/libtls/tls_server.c | 4 |
4 files changed, 11 insertions, 5 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index c028d19539..9b03c2b6f0 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.c,v 1.58 2017/01/22 08:27:50 claudio Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.59 2017/01/26 12:56:37 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -649,7 +649,7 @@ tls_close(struct tls *ctx) | |||
| 649 | goto out; | 649 | goto out; |
| 650 | } | 650 | } |
| 651 | 651 | ||
| 652 | if (ctx->ssl_conn != NULL) { | 652 | if (ctx->state & TLS_SSL_NEEDS_SHUTDOWN) { |
| 653 | ERR_clear_error(); | 653 | ERR_clear_error(); |
| 654 | ssl_ret = SSL_shutdown(ctx->ssl_conn); | 654 | ssl_ret = SSL_shutdown(ctx->ssl_conn); |
| 655 | if (ssl_ret < 0) { | 655 | if (ssl_ret < 0) { |
| @@ -658,6 +658,7 @@ tls_close(struct tls *ctx) | |||
| 658 | if (rv == TLS_WANT_POLLIN || rv == TLS_WANT_POLLOUT) | 658 | if (rv == TLS_WANT_POLLIN || rv == TLS_WANT_POLLOUT) |
| 659 | goto out; | 659 | goto out; |
| 660 | } | 660 | } |
| 661 | ctx->state &= ~TLS_SSL_NEEDS_SHUTDOWN; | ||
| 661 | } | 662 | } |
| 662 | 663 | ||
| 663 | if (ctx->socket != -1) { | 664 | if (ctx->socket != -1) { |
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c index d22a8a95ce..a1e2caa717 100644 --- a/src/lib/libtls/tls_client.c +++ b/src/lib/libtls/tls_client.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_client.c,v 1.39 2017/01/12 16:15:58 jsing Exp $ */ | 1 | /* $OpenBSD: tls_client.c,v 1.40 2017/01/26 12:56:37 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -297,6 +297,8 @@ tls_handshake_client(struct tls *ctx) | |||
| 297 | goto err; | 297 | goto err; |
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | ctx->state |= TLS_SSL_NEEDS_SHUTDOWN; | ||
| 301 | |||
| 300 | ERR_clear_error(); | 302 | ERR_clear_error(); |
| 301 | if ((ssl_ret = SSL_connect(ctx->ssl_conn)) != 1) { | 303 | if ((ssl_ret = SSL_connect(ctx->ssl_conn)) != 1) { |
| 302 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | 304 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); |
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h index 3650ca9462..37737c3499 100644 --- a/src/lib/libtls/tls_internal.h +++ b/src/lib/libtls/tls_internal.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_internal.h,v 1.51 2017/01/24 01:48:05 claudio Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.52 2017/01/26 12:56:37 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> | 3 | * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> |
| 4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 4 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| @@ -118,6 +118,7 @@ struct tls_conninfo { | |||
| 118 | 118 | ||
| 119 | #define TLS_EOF_NO_CLOSE_NOTIFY (1 << 0) | 119 | #define TLS_EOF_NO_CLOSE_NOTIFY (1 << 0) |
| 120 | #define TLS_HANDSHAKE_COMPLETE (1 << 1) | 120 | #define TLS_HANDSHAKE_COMPLETE (1 << 1) |
| 121 | #define TLS_SSL_NEEDS_SHUTDOWN (1 << 2) | ||
| 121 | 122 | ||
| 122 | struct tls_ocsp_result { | 123 | struct tls_ocsp_result { |
| 123 | const char *result_msg; | 124 | const char *result_msg; |
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index 5bf87552cb..1a1a48a169 100644 --- a/src/lib/libtls/tls_server.c +++ b/src/lib/libtls/tls_server.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls_server.c,v 1.33 2017/01/24 01:48:05 claudio Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.34 2017/01/26 12:56:37 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -457,6 +457,8 @@ tls_handshake_server(struct tls *ctx) | |||
| 457 | goto err; | 457 | goto err; |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | ctx->state |= TLS_SSL_NEEDS_SHUTDOWN; | ||
| 461 | |||
| 460 | ERR_clear_error(); | 462 | ERR_clear_error(); |
| 461 | if ((ssl_ret = SSL_accept(ctx->ssl_conn)) != 1) { | 463 | if ((ssl_ret = SSL_accept(ctx->ssl_conn)) != 1) { |
| 462 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | 464 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); |
