summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libtls/tls.c5
-rw-r--r--src/lib/libtls/tls_client.c4
-rw-r--r--src/lib/libtls/tls_internal.h3
-rw-r--r--src/lib/libtls/tls_server.c4
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
122struct tls_ocsp_result { 123struct 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");